我在某处看到了以下代码:
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,会发生什么?它会导致腐败的另一个对象吗?还是内存泄漏?
答案 0 :(得分:4)
person1
和person2
都指向相同的记忆?
他们的customerName
指针确实指向相同的内存,但是对象本身是分开的(尽管它们具有相同的内容)。
如果删除了
person1
,或删除了person2
,会发生什么?
不能删除任何一个,但它们可能超出范围。什么都不会发生,因为没有析构函数(这很糟糕)。
是否会导致其他对象损坏?还是内存泄漏?
类型Person
超出范围或被删除的对象即使没有分配也会导致内存泄漏。这是Person
类的错误,因为它没有析构函数。
每次在构造函数中进行分配时,都需要析构函数来重新分配构造函数分配的资源。添加析构函数后,The Rule of Three变得相关:您需要实现以下所有内容:
通过实施所有这三项功能,您的Person
课程变得安全无泄漏:在执行作业之前,将person1
分配给person2
会清除当前customerName
,并复制字符串。现在有两个对象指向单独的customerName
,确保可以在不相互降低的情况下销毁它们。
注意:每次在构造函数中看到显式分配时,请问自己是否绝对需要分配,并且指针不能替换为对象。
如果你的Person
课程的答案是“指针是否必要?”问题是一个响亮的“不”:你可以轻松地使string *customerName;
成为string customerName;
,这将立即使您无需添加析构函数,复制构造函数或赋值运算符。一切都会“正常工作” - 没有内存泄漏,双重删除或任何其他不良副作用。