說我有這樣的事情:如何在C++中從堆中刪除完整的對象?
a = new A();
a->b = new B();
a->b->c = new C();
如果我稱之爲:
delete(a)
難道還從內存中刪除b和c?我怎麼能確定他們都走了?
這是一個問題,出現在我的一個大學課堂上,由另一個學生製作。沒有更多的信息給出。我想有沒有明確的答案的話,因爲我不能告訴你關於A,B或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 = 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
。
取決於你的每個類的析構函數的作用。 – clcto
這取決於,A'',''B''和''C''析構函數是做什麼的? – nefas
這是一個我大學課程中提出的問題。這就是我的全部。我發現奇怪的是,它沒有更多的信息,但我想這只是一個糟糕的問題 –