请帮助我理解我的示例中移动语义的实现
我有一个简单的字符串类
class DynamicString
{
public:
char* CharArray;
int Length;
DynamicString(char* charArray, int length);
~DynamicString();
DynamicString(const DynamicString &dsObject);
DynamicString&operator= (const DynamicString &dsObject);
}
到目前为止,我正在尝试在没有移动语义的情况下实现复制和赋值运算符
DynamicString::~DynamicString()
{
delete[] CharArray;
CharArray = nullptr;
}
DynamicString::DynamicString(const DynamicString & dsObject)
{
Length = dsObject.Length;
CharArray = new char[Length];
for (int i = 0; i < Length; i++)
CharArray[i] = dsObject.CharArray[i];
}
DynamicString & DynamicString::operator=(const DynamicString & dsObject)
{
if (Length == dsObject.Length)
for (int i = 0; i < Length; i++)
CharArray[i] = dsObject.CharArray[i];
else
{
delete[] CharArray;
Length = dsObject.Length;
CharArray = new char[Length];
for (int i = 0; i < Length; i++)
CharArray[i] = dsObject.CharArray[i];
}
return *this;
}
阅读各种资源,据我了解,有必要将数组引用从一个重新排列到另一个。有点像CharArray = dsObject.CharArray;
内部复制和赋值,但问题是,在这种情况下,如果删除其中一个对象,是否会删除第二个对象的内容?问题是来自内存,如果丢失了对原始对象的引用,这种情况下会不会出现内存泄漏?
当你移动时,你不只是移动
还要将原始对象转换为零类型的某种状态-例如,
(更准确地说,是一个可以被析构函数安全接受的状态,并且不会导致任何问题,例如重新释放内存)。通常,您无法在移动对象后对其进行操作。
好吧,在这里您需要从移动语义开始,而是从 = 运算符开始