我正在阅读关于移动构造函数以尝试学习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 :(得分: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;
实际上是“偷走了另一个物体的内脏”。另一个对象不再需要它们,它很快就会消失。