gpt4 book ai didi

c++ - 如果在 C++ 中删除了其中一个对象怎么办?

转载 作者:行者123 更新时间:2023-11-27 23:12:55 28 4
gpt4 key购买 nike

我在某处看到了下面的代码:

class Person {
private:
string *customerName;
public:
Person() {customerName = new string;}
void setCustomerName(char *s) {*customerName = s;}
};


int main()
{
Person person1;
Person person2;

person1.setCustomerName("Malcolm");
person2 = person1;
}

person1 和 person2 是否都指向同一个内存?如果 person1 被删除,或者 person2 被删除,会发生什么?它会导致其他对象损坏吗?还是内存泄漏?

最佳答案

person1 and person2 all point to the same memory?

它们的 customerName 指针确实指向相同的内存,但对象本身是分开的(尽管它们具有相同的内容)。

and if person1 is deleted, or person2 is deleted, what will happen?

两者都不能被删除,但它们可以超出范围。什么都不会发生,因为没有析构函数(这很糟糕)。

does it will cause the corrupt the other object? or a memory leak?

Person 类型的对象超出范围或被删除即使没有分配也会导致内存泄漏。这是 Person 类的错误,因为它没有析构函数。

每次在构造函数中进行分配时,都需要一个析构函数来重新分配构造函数分配的资源。添加析构函数后,The Rule of Three变得相关:您需要实现以下所有内容:

  • 一个析构函数,
  • 复制构造函数,以及
  • 赋值运算符。

实现所有三个函数后,您的 Person 类变得安全且无泄漏:将 person1 分配给 person2 清理当前 customerName 赋值前复制字符串。现在两个对象指向不同的 customerName,确保它们可以被销毁而不会互相打倒。

注意:每次在构造函数中看到显式分配时,问问自己该分配是否绝对必要,并且指针不能用对象替换。

对于您的 Person 类,回答“是否需要指针?”问题是一个响亮的“否”:您可以轻松地使 string *customerName; 成为 string customerName;,这将立即使您无需添加析构函数、拷贝构造函数或赋值运算符。一切都会“正常工作”——没有内存泄漏、双重删除或任何其他不良副作用。

关于c++ - 如果在 C++ 中删除了其中一个对象怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18878551/

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