C++11 对于移动分配,如果将销毁留给右值,是否会发生内存泄漏?

C++11 对于移动分配,如果将销毁留给右值,是否会发生内存泄漏?,c++11,rvalue-reference,C++11,Rvalue Reference,参考,最后(第节:健壮编程)指出 为防止资源泄漏,请始终使用“免费” 资源(如内存、文件) 移动中的控制柄和插座) 赋值运算符 如果移动分配改为按以下方式执行,会发生什么情况: MemoryBlock& operator=(MemoryBlock&& other) { if (this != &other) { std::swap(_data, other._data); std::swap(_length, other._le

参考,最后(第节:健壮编程)指出

为防止资源泄漏,请始终使用“免费” 资源(如内存、文件) 移动中的控制柄和插座) 赋值运算符

如果移动分配改为按以下方式执行,会发生什么情况:

MemoryBlock& operator=(MemoryBlock&& other)
{
   if (this != &other)
   {
      std::swap(_data, other._data);
      std::swap(_length, other._length);
   }
   return *this;
}

当“其他”引用超出范围时,右值的“\u data”不会被释放吗?

是的,
其他。\u data
将在超出范围时被释放(当然,假设是一个好的析构函数)。但是,有一项需要考虑:如果
其他。_data
指的是需要及时销毁的资源,则在本设计后期可能会销毁。例如,互斥锁的锁定状态。

如果
MemoryBlock
的析构函数释放互斥锁,就会释放互斥锁。是的,示例中的析构函数释放互斥锁。我只是对MSDN文章中的语句感到好奇,因为交换成员似乎是编写移动构造函数和移动赋值方法的更简单的方法。但交换不会释放移动分配中的内存。事实上,您非常接近移动分配的简单方法。(注意,您只需要编写一个赋值运算符,而不是两个,正确完成。)