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

问题描述:

说我有这样的事情:如何在C++中从堆中删除完整的对象?

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

如果我称之为:

delete(a) 

难道还从内存中删除b和c?我怎么能确定他们都走了?

这是一个问题,出现在我的一个大学课堂上,由另一个学生制作。没有更多的信息给出。我想有没有明确的答案的话,因为我不能告诉你关于A,B或C的析构函数

+1

取决于你的每个类的析构函数的作用。 – clcto

+1

这取决于,A'',''B''和''C''析构函数是做什么的? – nefas

+0

这是一个我大学课程中提出的问题。这就是我的全部。我发现奇怪的是,它没有更多的信息,但我想这只是一个糟糕的问题 –

使用

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

你并不需要为A或B.默认的会做的析构函数。

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

如果你在你的程序这样的代码:

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

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

+0

谢谢,但正如我所说,这不是我的一段代码。对于我在大学的一门课而言,我不知道应该回答这个问题。 –

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

因此,换句话说,如果像这样的代码定义:

B::~B() { delete c; } 
A::~A() { delete b; } 

那么答案是肯定的。如果不是,答案是否定的。如果你不知道,那么答案是你无法知道。

+0

你认为'c'和'b'是原始指针,它是未知的。 – Slava

+0

我很确定这些行:'a-> b = new B(); '和'a-> b-> c = new C();'显示它们是指针。 –

+0

这不会改变任何东西,智能指针有许多实现,不仅在'std'中 – Slava

它是否也会从内存中删除b和c?

只有当A的析构函数包含代码才能明确地做到这一点,或者b是某种智能指针来处理它(并且可以接受赋值)。例如: -

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

我如何可以肯定的是所有的人都到哪里去了?

想必您会问一些避免泄漏的最佳实践。

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