2011-01-28 57 views
1

檢測內存泄漏以下是新/ delete操作符我在程序的模式。 Valgrind說,記憶「絕對失去」。我無法完全知道泄漏的位置。我使用新的/刪除操作符有什麼問題嗎?無法通過指甲的valgrind

class Generic 
{ 
     GenericInterface *gInterface; //GenericInterface is abstract class 

     public: 
      Generic() 
      { 
       gInterface = NULL; 
      } 
      ~Generic() 
      { 
       delete gInterface; 
      } 
      void Create() 
      { 
      gInterface = new Specific(); 
      } 
    }; 

    class Specific : public GenericInterface 
    { 
     MyClass* _myClass; 

    public: 
     Specific() 
     { 
     _myClass = new MyClass; 
     } 

     ~Specific() 
     { 
     delete _myClass; 
     } 

    }; 

    int main() 
    { 
     Generic g; 
     g.Create(); 
    } 

valgrind說內存丟失。

==2639== 8 bytes in 1 blocks are definitely lost in loss record 2 of 45 
==2639== at 0x4026351: operator new(unsigned int) (vg_replace_malloc.c:255) 
==2639== by 0x804D77C: Specific::Specific() (Specific.cc:13) 
==2639== by 0x804DAFC: Generic::Create() (Generic.cc:58) 

回答

11

您沒有關注rule of three。如果你的類管理需要清理的資源,你必須聲明析構函數,拷貝構造函數和拷貝賦值運算符。你的兩個類都沒有拷貝構造函數或拷貝賦值操作符。

真的,你幾乎應該只是使用智能指針像unique_ptr從的C++ 0x;來自Boost,C++ TR1和C++ 0x的shared_ptr;或Boost的scoped_ptr

造成這一特定問題的可能的問題是,你忘了做基類的析構函數GenericInterfacevirtual,所以錯誤的析構函數被調用和MyClass對象,你動態地創建Specific永遠不會被破壞。

delete荷蘭國際集團通過指針的目的是在未定義的行爲其基類的結果之一,如果基類的析構函數沒有聲明virtual(這意味着壞的事情會發生,從存儲器泄漏到崩潰)。

+0

當我把`虛擬〜GenericInterface()= 0;`,我得到未定義參考`〜GenericInterface()`錯誤`具體`析構函數。 – Meebo 2011-01-29 00:01:22

2

您的GenericInterface析構函數可能不是虛擬的,所以當gInterface被銷燬時,只有GenericInterface析構函數被調用。

0

貴GenericInterface類中聲明虛析構函數?否則,Specific類的析構函數將不會被調用,因此「delete _myClass」行將不會被執行。

只是另一種C++讓你的生活更有趣:)

0

在您的泛型類的析構函數,你也應該將其刪除之前檢查gInterface指針。如果在對象被銷燬之前未調用Create(),則會導致問題。如果你的C++編譯器不會對新的故障扔掉你的其他類也可以做同樣的事情