移动构造/运营商=

我想了解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

回到顶部