2013-04-14 24 views
0

我似乎有一點向量內存泄漏問題。 我的代碼如下所示:指向與矢量內存泄漏的對象

class CPart { 
    public: 
     virtual void print() = 0; 
    }; 

    //some other classes 

    class CDisk : public CPart { 
    public: 
     CDisk(int tp, int size); 
     ~CDisk(); 
     virtual void print(); 
     void AddPartition(int size, const string & dsc); 

     static const int MAGNETIC = 0; 
     static const int SDD = 1; 
    private: 

     struct CPartition { 
      CPartition(int size, const string & dsc); 
      int div_size; 
      string disk; 
     }; 
     int type; 
     int d_size; 
     vector<CPartition> ptts; 
    }; 

    CDisk::CDisk(int tp, int size) { 
     type = tp; 
     d_size = size; 
    } 

    CDisk::CPartition::CPartition(int size, const string& dsc) { 
     div_size = size; 
     disk = dsc; 
    } 

    void CDisk::AddPartition(int size, const string& dsc) { 
     ptts.push_back(CPartition(size, dsc)); 
    } 

    int main(int argc, char** argv) { 
     CDisk disk(CDisk::SDD, 5000); 
     disk.AddPartition(500, "disk1"); 
     CPart *disk2 = new CDisk(disk); 
     delete disk2; 
     return 0; 
    } 

當我運行此代碼Valgrind的,它說有內存泄漏和丟失的字節數是向量的PTT * CPartition的大小等於項目的數量。所以我猜測我必須以某種方式清理那個向量。我嘗試過,但無濟於事。

回答

2

你需要有virutal destructor在CPart

class CPart { 
    public: 
     virtual void print() = 0; 
     virtual ~CPart(){}; 
    }; 

否則你將得到下面的情形;

int main(int argc, char** argv) { 
     CDisk disk(CDisk::SDD, 5000); 
     disk.AddPartition(500, "disk1"); 
     CPart *disk2 = new CDisk(disk);//CDisk created 
     delete disk2;//But here only CPart is deleted leaving CDisks data in memory 
     return 0; 
    } 
+0

謝謝,這真的幫了我很多。 – user2274361

0

可以使用的valgrind通過使用附加的泄漏檢查參數,即非常精確地隔離內存泄漏的由來:

valgrind --leak-check=full ./a.out 

只要你的代碼與調試符號編譯的valgrind會告訴你究竟是從哪裏泄漏的。

0

我不認爲這部分是真的;

struct CPartition { 
    CPartition(int size, const string & dsc); 
    int div_size; 
    string disk; 
}; 

CDisk::CPartition::CPartition(int size, const string& dsc) { 
    div_size = size; 
    disk = dsc; 
} 

這是更好地把struct CPartition你的類定義,擺脫CDisk::CPartition::CPartition(int size, const string& dsc)即:

struct CPartition { 
    int div_size; 
    string disk; 
}; 

調用CPartition實例的div_size你應該做

instance_of_CPartition->div_size 

爲進一步,請閱讀structure tutorial

我不確定這是否會解決您的問題,但這將解決您的代碼中的另一個問題。