【发布时间】:2015-03-09 01:51:35
【问题描述】:
据我所知,理论上,如果一个类有一个原始指针成员,那么默认的复制构造函数会对该指针做一个浅拷贝,这样当原始对象被销毁时,拷贝中的指针成员就会有已删除它指向的值。这似乎意味着,除了出于某种原因我们想要限制复制的情况之外,任何具有原始指针成员的类都应该定义一个复制构造函数来对该指针进行深度复制。
我正在使用一个受人尊敬的第三方 API,并且我遇到了一个具有原始指针成员但没有定义复制构造函数的类,这使我对上述理解产生了怀疑。我错过了什么吗?
更新:第三方告诉我这个类不是要被复制的,因为这个对象代表一个视觉元素。他们指出他们应该创建一个私有副本构造函数。
【问题讨论】:
-
这取决于原始对象的析构函数做了什么。如果它删除它,那么您的分析是正确的。他们很可能不希望按照您讨论的方式制作副本。
-
@ikegami:一个不可复制的类应该有一个复制构造函数,它可以是
private或deleted。我们在这里不能 100% 确定,但我阅读问题的方式也不是这样。 -
@ikegami:我没有声称你做到了。
-
好吧,我再说一遍:并非所有的类都是为了处理复制尝试而编写的。这是一个特性,而特性需要付出努力(编码、测试、维护)。
-
@Jayz7522 当其他一些构造负责释放内存时(如果有必要的话)。例如,也许指针指向静态分配的东西。迭代器可能指向集合实现中的内部节点,但当迭代器被破坏时,它当然不应该删除它。
标签: c++ copy-constructor