我正在看这个显示移动构造函数的答案:
https://stackoverflow.com/a/3109981/997112
#include <cstring>
#include <algorithm>
class string
{
char* data;
public:
string(const char* p)
{
size_t size = strlen(p) + 1;
data = new char[size];
memcpy(data, p, size);
}
~string()
{
delete[] data;
}
string(const string& that)
{
size_t size = strlen(that.data) + 1;
data = new char[size];
memcpy(data, that.data, size);
}
};
然后引入了一个移动构造函数:
string(string&& that) // string&& is an rvalue reference to a string
{
data = that.data;
that.data = 0;
}
如果我们将指针data
分配给值that.data
,那么这肯定会导致new char[size]
内存data
最初指向的内存泄漏?我很困惑。
答案 0 :(得分:5)
data
尚未指向任何内容,因为这是构造函数。这是创建对象时首先发生的事情。
构造此对象时,它取得由另一个对象分配的that.data
的所有权。通过将0
分配给that.data
,可确保其他对象不会delete
数据。现在这个对象负责这样做,它将在它的析构函数中执行。