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

时间:2013-09-18 17:24:09

标签: c++ variable-assignment

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

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,会发生什么?它会导致腐败的另一个对象吗?还是内存泄漏?

1 个答案:

答案 0 :(得分:4)

  

person1person2都指向相同的记忆?

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

  

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

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

  

是否会导致其他对象损坏?还是内存泄漏?

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

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

  • 析构函数,
  • 复制构造函数和
  • 分配操作员。

通过实施所有这三项功能,您的Person课程变得安全无泄漏:在执行作业之前,将person1分配给person2会清除当前customerName,并复制字符串。现在有两个对象指向单独的customerName,确保可以在不相互降低的情况下销毁它们。

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

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