使用智能指针时,是否有必要阻止分配运算符和复制构造函数

Is it necessary to block the assignment operator and the copy constructor when using smart pointers?

本文关键字:分配 运算符 构造函数 复制 指针 智能 是否      更新时间:2023-10-16

我在几个地方都看到了定义您自己的作业操作员/复制构造函数或通过私有声明默认操作员的建议。

但是,我唯一能够找到的危险是创建可能以后将指针的指针副本的问题。

在现代的C 指针中很少见,大多数班级都使用智能指针(例如,从Boost或C 11中的STD库中使用)。是否仍然需要声明没有原始指针的类分配运算符和复制构造函数?

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

不是隐藏那些操作员。std::unique_ptr已经不可复制(您只能移动它)。和其他种类-std::shared_ptr将增加内部ref计数,std::weak_ptr将无需执行lock方法,因此无能为力。您可以在此处阅读更多(Boost Libs)

这在问题中解释了三个规则是什么?

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

我可以信任编译器生成的复制构造函数和作业操作员吗?

编译器生成的代码是您最好的朋友,只要 您坚持良好的练习并知道规则。如解释 在第一部分中,编译器生成的复制构造函数和作业 操作员执行用户指定数据成员的会员复制。经过 替换低级数据类型 - 原始指针和字符阵列 实例 - 与他们的高级标准库同行 STD :: TR1 :: shared_ptr和std :: String,不仅消除了 与手动资源管理相关的繁重错误,您也 确保编译器生成的复制构造函数和 分配操作员将做正确的事情。

没有定义自己的作业操作员/复制/移动构造器的危险是意外行为的可能性。这些操作很容易调用,而无需您意识到这一点,从而导致了意外的行为。在这种情况下,将其宣布为私人将导致汇编错误。

还要注意,并非到处都使用智能指针。通常不会有STL或Boost的受限制环境(例如内核,嵌入式等)。