如果在C++中删除了其中一个对象怎么办
what if one of the object is deleted in C++?
我在某处看到了以下代码:
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 被删除,会发生什么? 它会导致损坏另一个对象吗? 还是内存泄漏?
person1
和person2
都指向同一个记忆?
它们的customerName
指针确实指向相同的内存,但对象本身是分开的(尽管它们具有相同的内容)。
如果删除
person1
,或者删除person2
,会发生什么?
两者都不能删除,但它们可以超出范围。什么都不会发生,因为没有析构函数(这很糟糕)。
它会导致损坏另一个对象吗?还是内存泄漏?
类型为 Person
的对象超出范围或被删除,即使没有赋值也会导致内存泄漏。这是 Person
类的错误,因为它没有析构函数。
每次在构造函数中进行分配时,都需要一个析构函数来重新分配构造函数分配的资源。添加析构函数后,三法则变得相关:您需要实现以下所有内容:
- 析构函数,
- 复制构造函数,以及
- 赋值运算符。
实现所有三个函数后,Person
类变得安全且无泄漏:将person1
分配给 person2
会在进行赋值之前清理当前customerName
,并复制字符串。现在,两个物体指向分开的customerName
,确保它们可以在不相互破坏的情况下被摧毁。
注意:每次在构造函数中看到显式分配时,请问问自己该分配是否绝对必要,以及指针是否不能替换为对象。
如果你的Person
类,"指针是必要的吗?"问题的答案是一个响亮的"不":你可以轻松地string *customerName;
成为一个string customerName;
,这将立即让你免于添加析构函数、复制构造函数或赋值运算符。一切都会"正常工作" - 没有内存泄漏、双重删除或任何其他不良副作用。
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 如何使用函数将一个对象的输入复制到另一个对象中
- 选择一个元素而不是一个对象的数组的原因
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 打印对象的映射,其中另一个对象作为键
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 如果在C++中删除了其中一个对象怎么办