2014-02-15 62 views
0

我是在尝试学习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在重置过程中?不会最终成为内存泄漏?

+0

移动ctor与摧毁或释放任何东西无关。 – user2485710

回答

5

我的问题是,如果other.buf实际上是一个指针是不是想成为

delete other.buf; 

没有,因为早一行复制指针this->buf

buf=other.buf; 

移动构造函数正在使用任何内存b来自other对象,并确保other将被安全销毁。

这里是什么招构造其实就是做很好的说明:

右值引用,又名“移动建筑/分配,”是表达你是从一个对象建造或分配有用 方式 将不再用于其他任何事情 - 包括对于 示例,临时对象 - 所以您通常可以通过简单地窃取其他对象的内脏 而不是进行潜在的昂贵深度复制来获得体面的 性能提升。

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

所以这行:

buf=other.buf; 

实际上是 “偷其他对象的胆量。”另一个物体不再需要它们,它很快就会消失。