移动构造函数orphaning内存?

时间:2014-06-30 16:13:45

标签: c++ pointers c++11 memory-management move-semantics

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

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最初指向的内存泄漏?我很困惑。

1 个答案:

答案 0 :(得分:5)

data尚未指向任何内容,因为这是构造函数。这是创建对象时首先发生的事情。

构造此对象时,它取得由另一个对象分配的that.data的所有权。通过将0分配给that.data,可确保其他对象不会delete数据。现在这个对象负责这样做,它将在它的析构函数中执行。