如何在C ++中从堆中删除完整对象?

时间:2017-06-15 16:15:29

标签: c++ memory heap

说我有这样的事情:

a = new A(); 
a->b = new B(); 
a->b->c = new C();

如果我打电话:

delete(a)

它还会从内存中删除b和c吗?我如何确定所有这些都已消失?

这是我的一个大学课程中提出的问题,由另一个学生制作。没有更多信息。我想那时没有明确的答案,因为我无法告诉你有关A,B或C的析构函数

5 个答案:

答案 0 :(得分:1)

  1. 为A和B创建析构函数。
  2. 使用智能指针std :: unique_ptr(或std :: shared_ptr)。

答案 1 :(得分:1)

使用

class A
{
    std::shared_ptr<B> b;
}

你不需要A或B的析构函数。默认的就是。

答案 2 :(得分:1)

如果你的程序中有这样的代码:

a = new A(); 
a->b = new B(); 
a->b->c = new C();

你需要(重新)学习如何正确地用C ++编程。 b的成员ac的成员b应由其构造函数初始化,而不是直接初始化。当你编写一个使用动态内存的构造函数时,你应该立即考虑内存管理 - 通过智能指针或正确跟随rule of three/five/zero 在你这样做之后,毫无疑问,当a被销毁时,是否可以正确清理内存。

答案 3 :(得分:0)

  

它还会从内存中删除b和c吗?

只有当A的析构函数包含明确执行该操作的代码或者b是某种处理它的智能指针(并且可以接受赋值)时。 E.g:

class A {
  B *b;
  ~A() {
    delete b;
  }
};
  

我如何确定所有这些都已消失?

据推测,您正在询问避免泄漏的最佳做法。

  1. 请勿使用裸new / delete
  2. 负责分配资源的实体应始终负责解除分配资源。
  3. 使用RAII。

答案 4 :(得分:-1)

如果没有关于如何定义析构函数的任何信息,那么确实没有明确的答案。如果没有明确定义的析构函数,则使用默认的析构函数,代码会导致内存泄漏。如果为这些类正确定义了析构函数,那么是的,delete(a)应该从内存中删除b和c。

换句话说,如果在代码中定义了类似的内容:

B::~B() { delete c; }
A::~A() { delete b; }
然后答案是肯定的。如果没有,答案是否定的。如果你不知道,那么答案就是你无法知道。