0

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

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 被删除,会发生什么?它会导致损坏其他对象吗?还是内存泄漏?

4

1 回答 1

4

person1并且person2都指向同一个内存?

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

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

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

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

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

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

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

实现所有三个功能后,您的Person类变得安全且无泄漏:分配person1to在进行分配之前person2清理当前,并复制字符串。customerName现在两个对象指向不同customerName的 s,确保它们可以在不相互影响的情况下被销毁。

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

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

于 2013-09-18T17:29:51.867 回答