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

what if one of the object is deleted in C++?

本文关键字:一个对象 怎么办 删除 C++ 如果      更新时间:2023-10-16

我在某处看到了以下代码:

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;
}
人员

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

person1person2都指向同一个记忆?

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

如果删除person1,或者删除person2,会发生什么?

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

它会导致损坏另一个对象吗?还是内存泄漏?

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

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

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

实现所有三个函数后,Person类变得安全且无泄漏:将person1分配给 person2 会在进行赋值之前清理当前customerName,并复制字符串。现在,两个物体指向分开的customerName,确保它们可以在不相互破坏的情况下被摧毁。

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

如果你的Person类,"指针是必要的吗?"问题的答案是一个响亮的"不":你可以轻松地string *customerName;成为一个string customerName;,这将立即让你免于添加析构函数、复制构造函数或赋值运算符。一切都会"正常工作" - 没有内存泄漏、双重删除或任何其他不良副作用。

相关文章: