gpt4 book ai didi

c++ - 释放由赋值运算符 C++ 分配的内存

转载 作者:行者123 更新时间:2023-11-28 00:46:05 26 4
gpt4 key购买 nike

我正在浏览这篇文章 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
}

最佳答案

当你拥有这个时会发生什么?

{
MyString s = "Something";
}

这将首先构造一个 MyString,它可能会动态分配一个 char 数组来存储字符串数据。然后 s 变量超出范围并且 MyString 对象被销毁。它的析构函数应该通过执行 delete[] str 清理任何动态分配的内存。

假设您这样使用它:

{
MyString s = "Something";
s = some_other_string;
}

现在 MyString 对象以相同的方式构建,为字符串数据分配内存。第二行将调用赋值运算符。如果它如您所描述的那样实现,现有分配的 char 数组将被 deleted 并且将分配一个包含与 some_other_string< 相同的字符串数据的新数组。当 s 超出范围时,析构函数将销毁 this 新分配的数组。

析构函数只是delete[]成员str 指向的任何内容。调用赋值运算符后,它会删除[]新分配的数组。

关于c++ - 释放由赋值运算符 C++ 分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16203103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com