2017-06-15 77 views
0

說我有這樣的事情:如何在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

這是一個我大學課程中提出的問題。這就是我的全部。我發現奇怪的是,它沒有更多的信息,但我想這只是一個糟糕的問題 –

回答

1

使用

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

你並不需要爲A或B.默認的會做的析構函數。

1
  1. A和B.
  2. 使用智能指針的std ::的unique_ptr(或std創建析構函數:: shared_ptr的)。
1

如果你在你的程序這樣的代碼:

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

你需要(重新)學習如何在C++編程正確。成員ba和成員cb應該由其構造函數初始化,而不是直接。當你編寫一個使用動態內存的構造函數時,你應該立即考慮內存管理 - 通過智能指針或正確地遵循rule of three/five/zero 當你這樣做之後,當a被銷燬時內存將被正確地清理是沒有問題的。

+0

謝謝,但正如我所說,這不是我的一段代碼。對於我在大學的一門課而言,我不知道應該回答這個問題。 –

-1

沒有任何有關如何定義析構函數的信息,那麼確實沒有明確的答案。如果沒有明確定義的析構函數,那麼使用默認的析構函數,並且代碼會導致內存泄漏。如果爲這些類正確定義了析構函數,那麼是的,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

0

它是否也會從內存中刪除b和c?

只有當A的析構函數包含代碼才能明確地做到這一點,或者b是某種智能指針來處理它(並且可以接受賦值)。例如: -

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

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

想必您會問一些避免泄漏的最佳實踐。

  1. 請勿使用裸露的new/delete
  2. 負責分配資源的實體應始終負責釋放資源。
  3. 使用RAII。