移动构造/运营商=
我想了解C++的新功能,即移动构造函数和赋值X::operator=(X&&)
,我发现interesting example,但我唯一不甚了解,但更不同意的是移动ctor和赋值运算符中的一行(标注在下面的代码):移动构造/运营商=
MemoryBlock(MemoryBlock&& other) : _data(NULL)
, _length(0)
{
std::cout << "In MemoryBlock(MemoryBlock&&). length = "
<< other._length << ". Moving resource." << std::endl;
// Copy the data pointer and its length from the
// source object.
_data = other._data;
_length = other._length;
// Release the data pointer from the source object so that
// the destructor does not free the memory multiple times.
other._data = NULL;
other._length = 0;//WHY WOULD I EVEN BOTHER TO SET IT TO ZERO? IT DOESN'T MATTER IF IT'S ZERO OR ANYTHING ELSE IT IS JUST A VALUE.
}
所以我的问题是:我必须lenght_的值设置为零或我可以离开它不变?不会有任何内存泄漏,并且一个表达式不会有任何缺陷。
回答:
因为“移出”对象最终仍然会被破坏,所以你必须保持一致的状态。当然,具体怎么做取决于你的对象,在这种情况下,它显然意味着将数据指针置零并将长度设置为零。
回答:
出乎意料的是,程序员决定长度总是应该有一个正确的值。如果您没有设置它,在析构函数的代码将不再打印正确的事情:
std::cout << "In ~MemoryBlock(). length = " << _length << ".";
回答:
_length
和_data
是语义相关的项目。对于处于一致状态的对象,_length
应该始终告诉您在_data
指向的块中有多少内存。当_data
指向100个块,_length
应当是100时_data
点1块,_length
应该是1.如果_data
不指向任何东西(NULL),然后_length
应该是0。否则,如果_data
是NULL和_length
是100,那么你的对象处于不一致的状态。当我这样做:
for (int i = 0; i < _length; ++i) {
// do something with _data[i], such as:
_data[i] = 0;
}
我不应该崩溃。如果您未能正确设置_length
,则会崩溃。 真正的问题是,为什么你会故意将对象置于不一致的状态,导致崩溃?
回答:
这个问题很难得到明确的答案。移动语义是新的,C++社区仍在学习如何正确使用它。
我看到的一个合理的规则是,“离开”对象必须安全地破坏并且能够被赋予新的值。将_length
设置为零不必满足该规则,坦率地说,我不确定int表示无效状态的值是多少;在你的情况下可能是-1?
回答:
您正在移动数据的对象可能不是临时的(例如,您可能使用std :: move) - 将对象置于无效状态将会是一种糟糕的形式。
回答:
将该值设置为零只会显示一致性。但是,答案真的取决于如何打算使用_length来销毁对象。如果不使用长度来确定是否应删除_data(当移动的对象超出范围时),那么我们可以说移动对象时忽略_length是安全的。只要确保在任何派生类型中保持一致性,并确保您忽略_length的决定已记录在案。
以上是 移动构造/运营商= 的全部内容, 来源链接: utcz.com/qa/259984.html