移动构造函数orphaning内存?

use*_*112 0 c++ pointers memory-management move-semantics c++11

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

/sf/answers/217698701/

#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);
    }

};
Run Code Online (Sandbox Code Playgroud)

然后介绍一个移动构造函数:

string(string&& that)   // string&& is an rvalue reference to a string
{
    data = that.data;
    that.data = 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我们分配指向data该值的指针that.data,肯定这会导致内存泄漏,该new char[size]内存data最初指向的内存?我很迷惑.

Jos*_*eld 5

data还没有指向任何东西,因为这是构造函数.这是创建对象时首先发生的事情.

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