簡體   English   中英

使用基類指針刪除派生類時出現內存泄漏

[英]memory leak when deleting derived class with base-class pointer

我有一個內存泄漏的問題。 我有一個基類指針。 從中,我使用new來分配不同的派生類。 然后,當我嘗試使用引用(不是類型轉換) delete這些類時,我得到內存泄漏。 我研究了這個問題,發現我應該在基類中添加一個虛擬析構函數,但是我嘗試了這個並且仍然有內存泄漏; 也就是說,根據我的任務管理器,使用基類指針每次分配和刪除派生類時,內存使用量會繼續增加。 我試圖使它成為一個抽象的析構函數,並在派生類中添加了析構函數,但是我得到了一個未定義的引用錯誤。 我還嘗試將指針類型轉換為delete的派生類指針,但顯然這會使程序崩潰。

有誰知道我應該怎么做?

示例代碼:

class A {
public:
  A();
  ~A() {};
  virtual ~A();      /*or*/
  virtual ~A()=0;    /*or*/
                     /*or nothing?*/
}

class B: private A {
public:
  B();
  ~B() {};           /*this?*/
                     /*or nothing?*/
}

你有多確定存在內存泄漏? 通常,任務管理器在這里沒有太大幫助,因為它無法分辨出實際分配了多少屬於您的進程的內存。 即使釋放的內存仍然屬於您的進程,並且可能在以后由內存管理(通常是類似malloc的系統庫)使用。

使用諸如mallocdebug,valgrind,purify等工具來查明是否存在真正的內存泄漏。 這些工具將用一個新工具替換malloc實現,該工具跟蹤已分配的內存並報告在進程終止時未釋放的內存。

注意:在大多數系統上,在進程退出之前,從進程中釋放的內存不會返回到系統。 但是,它可以從同一個進程中獲得新的分配。

如果你有一個虛擬析構函數,你的子類的析構函數都將被調用。 不需要用抽象解構器或任何東西做任何神秘的魔法。

我會假設內存泄漏位於對象內部。 也許你在B(或A的?)構造函數中調用new() ,但是你不刪除它。 沒有看到更多的代碼,我只能說“你的析構函數設置很好”。

使用virtual ~A();

如果允許virtual ~A()=0我會感到驚訝。

使用此代碼:

A* base = new B();
delete base;

然后將調用B然后A的析構函數。

如果你真的還在泄漏記憶,那么你在其他地方又有另一個泄漏。

您可以使用:

virtual ~A(){}

要么

virtual ~A()=0; 

// as long as there is also:
A::~A(){}  // inline in the header file or non-inline in the cpp file.

這意味着:

A* base;
...
delete base;

將以正確的順序調用派生類的所有析構函數。

注意純虛擬析構函數: virtual ~A()=0; 如果在沒有其他成員函數是純虛擬時需要擁有抽象基類,則可能很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM