【发布时间】:2013-04-18 15:50:33
【问题描述】:
我正在阅读这篇文章Why do we need to delete allocated memory in C++ assignment operator?,我对赋值运算符中的新操作分配的内存有疑问。在我们分配给一个 MyString 对象 testObject 之后,它是如何被释放的呢? testObject 的析构函数是否会在超出范围时被调用,或者我必须显式调用 delete 来释放该内存?
const MyString& operator=(const MyString& rhs)
{
if (this != &rhs) {
delete[] this->str; // Why is this required?
this->str = new char[strlen(rhs.str) + 1]; // allocate new memory
strcpy(this->str, rhs.str); // copy characters
this->length = rhs.length; // copy length
}
return *this; // return self-reference so cascaded assignment works
}
【问题讨论】:
-
它应该在析构函数中被释放,如果你已经正确实现它。
-
不完全是重复的,但是如果你要写一个资源管理类,你需要知道所有关于Rule of Three的知识。
-
是的,我知道,但是析构函数会释放赋值运算符中分配的内存吗?我认为它只会释放复制构造函数中分配的内存。
-
@vkaul11:析构函数应该包含
delete[] str;,它将释放最近分配的数组,无论它是在哪里分配的。这也是为什么您需要删除该运算符中的旧数组,然后在下一行覆盖指向它的指针。 -
析构函数将释放它被指示释放的任何内存。
标签: c++