如何在C++中从堆中删除完整的对象?
说我有这样的事情:如何在C++中从堆中删除完整的对象?
a = new A();
a->b = new B();
a->b->c = new C();
如果我称之为:
delete(a)
难道还从内存中删除b和c?我怎么能确定他们都走了?
这是一个问题,出现在我的一个大学课堂上,由另一个学生制作。没有更多的信息给出。我想有没有明确的答案的话,因为我不能告诉你关于A,B或C的析构函数
使用
class A
{
std::shared_ptr<B> b;
}
你并不需要为A或B.默认的会做的析构函数。
- A和B.
- 使用智能指针的std ::的unique_ptr(或std创建析构函数:: shared_ptr的)。
如果你在你的程序这样的代码:
a = new A();
a->b = new B();
a->b->c = new C();
你需要(重新)学习如何在C++编程正确。成员b
的a
和成员c
的b
应该由其构造函数初始化,而不是直接。当你编写一个使用动态内存的构造函数时,你应该立即考虑内存管理 - 通过智能指针或正确地遵循rule of three/five/zero 当你这样做之后,当a
被销毁时内存将被正确地清理是没有问题的。
谢谢,但正如我所说,这不是我的一段代码。对于我在大学的一门课而言,我不知道应该回答这个问题。 –
没有任何有关如何定义析构函数的信息,那么确实没有明确的答案。如果没有明确定义的析构函数,那么使用默认的析构函数,并且代码会导致内存泄漏。如果为这些类正确定义了析构函数,那么是的,delete(a)
应该从内存中删除b和c。
因此,换句话说,如果像这样的代码定义:
B::~B() { delete c; }
A::~A() { delete b; }
那么答案是肯定的。如果不是,答案是否定的。如果你不知道,那么答案是你无法知道。
它是否也会从内存中删除b和c?
只有当A的析构函数包含代码才能明确地做到这一点,或者b
是某种智能指针来处理它(并且可以接受赋值)。例如: -
class A {
B *b;
~A() {
delete b;
}
};
我如何可以肯定的是所有的人都到哪里去了?
想必您会问一些避免泄漏的最佳实践。
- 请勿使用裸露的
new
/delete
。 - 负责分配资源的实体应始终负责释放资源。
- 使用RAII。
取决于你的每个类的析构函数的作用。 – clcto
这取决于,A'',''B''和''C''析构函数是做什么的? – nefas
这是一个我大学课程中提出的问题。这就是我的全部。我发现奇怪的是,它没有更多的信息,但我想这只是一个糟糕的问题 –