在处理动态内存分配的类中,浅复制基本上会导致程序删除资源两次。在移动操作中,原始指针不再指向资源,那么为什么在移动语义中会出现相同的行为呢?例如:
#include <utility>
#include <cstring>
using namespace std;
class MyString
{
char* cstr;
public:
MyString(const char* arg)
: cstr(new char[strlen(arg)+1])
{
strcpy(cstr, arg);
}
MyString(MyString&&) = default;
MyString& operator=(MyString&&) = default;
MyString(const MyString&) = delete;
MyString& operator=(const MyString&) = delete;
~MyString()
{
delete[] cstr;
}
};
int main()
{
MyString S1{"aaa"};
MyString S2 = move(S1); // error
}
Run Code Online (Sandbox Code Playgroud)
我尝试过 3 个不同的编译器,得到了相同的结果。