2012-01-08 93 views
1

我對C++內存管理相當陌生。我讀Should every class have a virtual destructor?,發現這個答案:使用受保護的析構函數刪除對象

每一個抽象類,要麼有一個

  • 保護的析構函數或
  • 虛析

如果你有一個非公開虛擬析構函數,這是不好的,因爲它允許用戶通過該指針刪除一個派生的對象。因爲我們都知道,這是未定義的行爲。

對於不打算通過指向它的指針進行刪除的類,沒有任何理由擁有虛擬析構函數。這不僅會浪費資源,更重要的是會給用戶一個錯誤的提示。試想一下,std :: iterator是一個虛擬析構函數會有什麼蹩腳的感覺。

所以我現在有一個受保護的析構函數(我不是從類中派生的)。

在另一個類,雖然我有一個指向這個對象的指針。在我的構造函數中,我讓指針成爲該類的「新」對象,在我的設計師中,我想摧毀它。

我該怎麼做?如果析構函數沒有被保護,我會得到一個seg錯誤(我不完全明白,但我意識到編程是錯誤的)。如果析構函數受保護,我不知道如何刪除該對象。

回答

3

您在上面的代碼塊中缺少術語「抽象」。 「抽象」的意思是,你不應該/有/該類的對象。如果你有一個類的對象,它應該幾乎總是有一個公共的析構函數。

+0

好的,但是如果我公開析構函數,當我嘗試刪除該對象時,會出現段錯誤 – jcuenod 2012-01-08 14:15:33

+0

我意識到我的問題在於要刪除的類中某處。在這一點上,我正在考慮構造函數。 – jcuenod 2012-01-08 15:17:20

+1

你必須顯示一些代碼。段錯誤很可能不是來自內置結構,而是來自您自己的編程:) – filmor 2012-01-08 15:18:18

相關問題