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

时间:2012-11-02 08:46:06

标签: c++ operator-overloading smart-pointers copy-constructor

我已经在几个地方看到了建议你定义你自己的赋值运算符/复制构造函数,或者通过声明它们是私有的来阻止默认值。

但是,我能找到的唯一危险就是创建指针副本的问题,这些指针可能会在以后悬挂指针。

在现代C ++中,指针很少见,大多数类只使用智能指针(例如来自boost或来自C ++ 11中的std库)。是否仍然需要为没有原始指针的类声明赋值运算符和复制构造函数?

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

3 个答案:

答案 0 :(得分:1)

不是没有必要隐藏这些运营商。 std::unique_ptr已经是不可复制的(你只能移动它)。其他类型 - std::shared_ptr将增加内部引用计数,std::weak_ptr将不执行任何操作,因为它具有lock方法。您可以阅读更多here (Boost libs)

答案 1 :(得分:0)

问题What is The Rule of Three?

中对此进行了解释

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

  

Can I trust the Compiler-Generated Copy Constructor and Assignment Operator?

     

编译器生成的代码是你最好的朋友,只要这样   你坚持良好的风格OO实践并了解规则。如上所述   在第一部分中,编译器生成的复制构造函数和赋值   运算符执行成员方式复制用户声明的数据成员。通过   替换低级数据类型 - 原始指针和char数组   实例 - 与他们的高级标准库对应物   std :: tr1 :: shared_ptr和std :: string,不仅消除了   与手动资源管理相关的繁重错误,你也是   保证编译器生成的拷贝构造函数和   赋值运算符将做正确的事。

答案 2 :(得分:-1)

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

另请注意,并非所有智能指针都使用。有更多受限制的环境(例如内核,嵌入式等)通常不会有STL或提升。