说我有这样的事情:
a = new A();
a->b = new B();
a->b->c = new C();
如果我打电话:
delete(a)
它还会从内存中删除b和c吗?我如何确定所有这些都已消失?
这是我的一个大学课程中提出的问题,由另一个学生制作。没有更多信息。我想那时没有明确的答案,因为我无法告诉你有关A,B或C的析构函数
答案 0 :(得分:1)
答案 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
的成员a
和c
的成员b
应由其构造函数初始化,而不是直接初始化。当你编写一个使用动态内存的构造函数时,你应该立即考虑内存管理 - 通过智能指针或正确跟随rule of three/five/zero
在你这样做之后,毫无疑问,当a
被销毁时,是否可以正确清理内存。
答案 3 :(得分:0)
它还会从内存中删除b和c吗?
只有当A的析构函数包含明确执行该操作的代码或者b
是某种处理它的智能指针(并且可以接受赋值)时。 E.g:
class A {
B *b;
~A() {
delete b;
}
};
我如何确定所有这些都已消失?
据推测,您正在询问避免泄漏的最佳做法。
new
/ delete
。答案 4 :(得分:-1)
如果没有关于如何定义析构函数的任何信息,那么确实没有明确的答案。如果没有明确定义的析构函数,则使用默认的析构函数,代码会导致内存泄漏。如果为这些类正确定义了析构函数,那么是的,delete(a)
应该从内存中删除b和c。
换句话说,如果在代码中定义了类似的内容:
B::~B() { delete c; }
A::~A() { delete b; }
然后答案是肯定的。如果没有,答案是否定的。如果你不知道,那么答案就是你无法知道。