我正在看这个显示 move 构造函数的答案:
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);
}
};
然后引入一个 move 构造函数:
string(string&& that) // string&& is an rvalue reference to a string
{
data = that.data;
that.data = 0;
}
如果我们将指针 data
分配给值 that.data
,这肯定会导致 new char[size]
内存泄漏data
最初指向哪个?我很困惑。
data
还没有指向任何东西,因为这是构造函数。这是创建对象时发生的第一件事。
当构造这个对象时,它获得了由另一个对象分配的that.data
的所有权。通过将 0
分配给 that.data
,可以确保其他对象不会删除
数据。现在该对象负责执行此操作,它将在其析构函数中执行。
我是一名优秀的程序员,十分优秀!