使用移动构造函数重置

时间:2014-02-15 16:54:04

标签: c++11

我正在阅读关于移动构造函数以尝试学习C ++ 11并且它声明了

  

移动构造函数重置源指针rhs.data_。这条路,   当临时被销毁时,删除[]将被无害地应用   到空指针。

现在作者做了类似这样的事情

MemoryPage(MemoryPage&& other): size(0), buf(nullptr)
{
   // pilfer other’s resource
   size=other.size;
   buf=other.buf;
   // reset other
   other.size=0;
   other.buf=nullptr;
}

我的问题是,如果other.buf实际上是一个指针,那么它应该是

delete other.buf;

为什么我们只是在重置期间为它分配nullptr?它不会最终成为内存泄漏吗?

1 个答案:

答案 0 :(得分:5)

  

我的问题是,如果other.buf实际上是一个指针,那么它应该是

delete other.buf;

不,因为之前您将指针复制到this->buf

buf=other.buf;

move构造函数从other对象获取任何内存缓冲区,并确保other将被安全销毁。

以下是移动构造函数实际执行的很好的描述:

  

Rvalue引用,又名“移动构造/赋值”,是有用的   表达你正在构建或从一个对象分配的方式   这将不再用于其他任何事情 - 包括   例如,一个临时对象 - 所以你经常可以得到一个体面的   通过简单地窃取另一个对象的内容来提升性能   而不是制作一个潜在的昂贵的深层副本。

http://herbsutter.com/2007/05/10/trip-report-april-2007-iso-c-standards-meeting/

所以这一行:

buf=other.buf;

实际上是“偷走了另一个物体的内脏”。另一个对象不再需要它们,它很快就会消失。