2012-06-04 322 views
1

我有以下問題:內存泄漏

當我使用std :: vector的內置插件我沒有得到一個內存,但如果我使用類,我得到的內存泄漏。爲了說明:

//No leak 
std::vector<double>* vecPtr1=new std::vector<double>(); 
//add some elements 
delete vecPtr1; 

//Leaks some memory but not all 
std::vector<SomeClass>* vecPtr2=new std::vector<SomeClass>(); 
//add some elements with vecPtr2->push_back(SomeClass()); 
delete vecPtr2; 

據我瞭解刪除應該調用的std ::向量的析構函數應依次調用SomeClass的析構函數 - >無泄漏。我已經投入了一些思考和測試到這一點,相同的行爲發生,如果我使用std :: vector的一個範圍,如這裏:

{ 
    std::vector<SomeClass> vector; 
    //add elements as before 
} 
//memory is still used here 

我使用Ubuntu 11.10下GCC 4.6.1。我的圖書館有什麼不妥或者我有一個誤解std :: vector如何破壞元素?

爲了澄清我有SomeClass的完整代碼替換的std ::對(是的,我知道有些部分被黑客控制,但它僅僅是一個例子):

#include <iostream> 
#include <vector> 
#include <utility> 

int main() 
{ 
    std::string inString; 
    std::cout<<"Started"<<std::endl; 
    //wait 
    std::cin>>inString; 
    { 
     //assign vector 
     std::vector<std::pair<std::string,unsigned int> > vec=std::vector<std::pair<std::string,unsigned int> >(); 
     //push elements 
     for(unsigned int i=0;i<1e7;++i) 
     { 
      vec.push_back(std::pair<std::string,unsigned int>("something",i)); 
     } 
     std::cout<<"Created vector with capacity: "<<vec.capacity()<<std::endl; 
     //wait 
     std::cin>>inString; 
    } 
    //vec should go out of scope but not all memory gets freed 
    std::cout<<"Deleted vector"<<std::endl; 
    //wait 
    std::cin>>inString; 
    std::cout<<"Shutting down"<<std::endl; 

    return 0; 
} 
+2

你如何檢測內存泄漏?更重要的是,你必須給你一些'SomeClass'的代碼,因爲構造函數和析構函數的實現可能會導致意外的內存行爲 – weidi

+0

@weidi首先,我只看了一下ps的內存使用情況(壞的,我知道)。 'Valgrind --tool = memcheck --leak-check = yes'告訴我不要擔心總堆使用率:109個分配,109個釋放,7,506個字節分配。但是,如果我運行程序一次,直到「_Deleted vector_」,然後啓動第二個實例,linux開始填充交換,這對我的理解意味着內存仍在使用中。 – denahiro

+0

「但是如果我運行程序一次,直到」已刪除的矢量「,然後啓動第二個實例,linux開始填充交換,這對我的理解意味着內存仍在使用中。」 - 你的初始假設是不正確的。不要將內存管理與操作系統的內存管理混爲一談。 – Joe

回答

6

首先,你不應該創建矢量對象動態。這是一個糟糕的主意。也就是說,使用自動向量:

std::vector<SomeClass> classes; //automatic object 

不管怎樣,在你的情況,我想問題在於類SomeClass

我想這個類管理內存,並沒有實現下列正確的至少一個:

  • 拷貝構造
  • 拷貝賦值
  • 析構函數

如果」重新使用C++ 11,那麼還有兩個成員:

  • 移動構造函數
  • 布展分配

我建議你閱讀這些:

3

應該不會出現任何有泄漏,如果SomeClass提供了正確的析構函數。

你有拷貝構造函數和賦值操作符嗎?析構函數是否清除它擁有的全部內存?

另外,你怎麼知道你在泄漏內存。你是使用像Valgrind或Purify這樣的工具,還是僅僅在查看內存位置?

0

問題是「SomeClass」。

它很可能會分配不破壞釋放的內存。 如果你發佈你的「SomeClass」,它會有所幫助