微软示例的这个移动构造函数似乎有冗余代码

This move constructor of Microsoft example appears to have redundant code

开发人员的 MSDN page 具有以下代码片段:

// Move constructor.  
MemoryBlock(MemoryBlock&& other) : _data(nullptr), _length(0)  
{  
   std::cout << "In MemoryBlock(MemoryBlock&&). length = "   
             << other._length << ". Moving resource." << std::endl;  

   // Copy the data pointer and its length from source object.  
   _data = other._data;      // Assginment 1
   _length = other._length;  // Assignment 2

   // Release the data pointer from the source object so that  
   // the destructor does not free the memory multiple times.  
   other._data = nullptr;  
   other._length = 0;  
}

当指令标记为 作业 1作业 2 时,_data(nullptr)_length(0) 有什么用覆盖 _data_length?

的值

为了安全。

假设由于某种原因,other._data and/or other._length 无法访问它们的值(最有可能是指针 other._data)。

一个例子可能是指针指向无效内存并产生分段错误(因为您可能会访问不属于您的程序的内存),并且程序会在此时崩溃。另一种可能是other*nullptr,等等……那么_data_length的值是多少呢?未定义。

如果这两个有初始值就好了,因为这可能有助于调试,因为程序员可以认为,既然这两个有初始值,也许赋值有问题。

当然应该

// Move constructor.  
MemoryBlock(MemoryBlock&& other) : _data(other._data), _length(other._length)
{  
   std::cout << "In MemoryBlock(MemoryBlock&&). length = "   
             << other._length << ". Moving resource." << std::endl;  

   // Release the data pointer from the source object so that  
   // the destructor does not free the memory multiple times.  
   other._data = nullptr;  
   other._length = 0;  
}