微软示例的这个移动构造函数似乎有冗余代码
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;
}
开发人员的 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;
}