1

我真的很难学习使“其他”对象无效,我刚刚在这里阅读了有关移动语义的整篇大文章,我很失望,因为它不包括无效。

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

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

4

4 回答 4

3

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

于 2012-04-26T20:03:02.110 回答
2

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

于 2012-04-26T19:53:24.957 回答
0

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

但是将指针归零可以避免将其称为空指针,Dangling pointer因为它在为其分配的内存空闲后指向空值。进一步使用这些指针并取消引用这些指针将导致比不这样做时更容易定位的核心转储。不这样做会产生意想不到的结果,并导致难以找到核心转储,甚至导致数据损坏。

简而言之,您应该只注意使指针无效。

于 2012-04-26T20:06:28.210 回答
0

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

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

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

于 2012-04-26T20:16:43.207 回答