我真的必须取消移动构造函数/移动赋值中的所有成员或只是指针吗?

时间:2012-04-26 19:49:47

标签: c++ move-constructor

我很难学习取消“其他”对象,我刚刚阅读了关于移动语义here的整篇大文章,我很失望,因为它没有涵盖无效

请解释一下,我们真的需要取消“其他”的所有成员或仅指向动态分配内存的指针吗?

为什么我们要关心不在堆上的成员(其他对象)?有什么好理由吗?

4 个答案:

答案 0 :(得分:3)

从对象移开后,它的析构函数在清理后仍然会被调用。这意味着它需要知道它是否应该释放它拥有的资源,因此它们需要被取消(或者你称之为!)所以指针不会被双重删除等。

答案 1 :(得分:2)

您需要将已移动的对象保留为有效状态。我认为这意味着不使用该对象会导致未定义的行为。实际上,这意味着不要让指针指向已释放的内存。我可以想象可能存在其他场景,例如对象是否持有任何其他资源(打开套接字,文件等等)。

答案 2 :(得分:0)

我不知道在构造函数的情况下你是否真的是这个意思,甚至是动态分配普通指针的情况。

但Nullyfing指针将其保存为Dangling pointer,因为它在为其分配的内存空闲后指向null。进一步使用这些指针并解除引用这些指针将导致核心转储,这些核心转储比未执行时更容易定位。不这样做可能会产生意想不到的结果,导致核心转储很难找到甚至数据损坏。

简而言之,你应该只关注指针。

答案 3 :(得分:0)

像往常一样,“这取决于”。

仍然必须销毁移动的对象,或者可能分配新值。您必须将其置于这些操作将起作用的状态。

如果您有“被盗”指向动态数据的指针,您可能必须将null指定给原始指针,以便删除它们。如果其中一个整数成员保持指向的对象的大小,则可能必须将其归零(与空指针一致)。其他值可能保持不变。