移动构造函数孤立内存

Move constructor orphaning memory?

本文关键字:内存 构造函数 移动      更新时间:2023-10-16

我正在看这个答案显示移动构造函数:

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,这肯定会导致data最初指向的new char[size]内存的内存泄漏?

data没有指向任何东西,因为这是构造函数。这是创建对象时发生的第一件事。

在构造这个对象时,它占有另一个对象分配的that.data的所有权。通过将0赋值给that.data,可以确保其他对象不会将数据delete。现在这个对象负责这样做,它将在析构函数中完成。