C++ 使用智能指针时是否需要阻止赋值运算符和复制构造函数?

C++ 使用智能指针时是否需要阻止赋值运算符和复制构造函数?,c++,operator-overloading,smart-pointers,copy-constructor,C++,Operator Overloading,Smart Pointers,Copy Constructor,我在几个地方看到过这样的建议:要么定义自己的赋值运算符/复制构造函数,要么通过声明它们为私有来阻止默认的赋值运算符/复制构造函数 然而,我能找到的唯一危险是创建指针副本的问题,这些副本可能会在以后挂起指针 在现代C++指针中很少见,大多数类只使用智能指针(例如从Boost或C++ 11中的STD库)。对于没有原始指针的类,仍然需要声明赋值运算符和复制构造函数吗 主要是:不这样做有什么危险?什么样的意外行为会发生?不定义自己的赋值运算符/复制/移动构造函数的危险在于可能发生意外行为。这些操作很容易

我在几个地方看到过这样的建议:要么定义自己的赋值运算符/复制构造函数,要么通过声明它们为私有来阻止默认的赋值运算符/复制构造函数

然而,我能找到的唯一危险是创建指针副本的问题,这些副本可能会在以后挂起指针

<>在现代C++指针中很少见,大多数类只使用智能指针(例如从Boost或C++ 11中的STD库)。对于没有原始指针的类,仍然需要声明赋值运算符和复制构造函数吗


主要是:不这样做有什么危险?什么样的意外行为会发生?

不定义自己的赋值运算符/复制/移动构造函数的危险在于可能发生意外行为。这些操作很容易在您不知道的情况下调用,从而导致意外行为。在这种情况下,将它们声明为私有将导致编译错误


还请注意,并非所有地方都使用智能指针。有更多的受限环境(如内核、嵌入式等)通常不会有STL或boost。

没有必要隐藏这些操作符
std::unique_ptr
已不可复制(您只能移动它)。和其他类型-
std::shared_ptr
将增加内部引用计数,
std::weak_ptr
将不起任何作用,因为它具有
锁定
方法。您可以阅读更多内容

问题中对此进行了解释

在以下网站上也有很好的解释:

编译器生成的代码是您最好的朋友,前提是 您坚持良好的OO实践风格并了解规则。如前所述 在第一部分中,编译器生成的复制构造函数和赋值 操作员执行用户声明的数据成员的成员复制。通过 替换低级数据类型--的原始指针和字符数组 实例--与它们的高级标准库对应 std::tr1::shared_ptr和std::string,不仅消除了 与手动资源管理相关的繁重bug 保证编译器生成复制构造函数和 赋值操作符将做正确的事情


对于您的应用程序来说,增加内部引用计数并不是必需的,并且可能会产生逻辑后果您可能会忘记及时重置这些指针以释放它们所拥有的内存。因此,问题是:什么样的意外行为对应用程序可能是危险的?任何意外行为都可能是危险的,因为,这是出乎意料的…您需要定义自己的赋值运算符或复制构造函数的唯一时间是在定义析构函数的同时。这是最新的。但是,如果您只使用资源管理类而不创建资源管理类,那么就不需要做任何特殊的事情,因为为您的类隐式生成的特殊函数将使用资源管理类中专门编写的函数,这应该是正确的。