簡體   English   中英

將std :: vector與類元素一起使用時發生內存泄漏

[英]Memory leak when using std::vector with class elements

我有以下問題:

當我將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;

據我了解,delete應該調用std :: vector的析構函數,而后者應該依次調用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 :: pair的完整代碼(是的,我知道某些部分被黑了,但這只是一個例子):

#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;
}

首先,您不應該動態創建矢量對象。 那簡直是個壞主意。 也就是說,使用自動向量:

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

無論如何,就您而言,我猜問題出在類SomeClass

我猜這個類管理內存,並且沒有正確實現以下至少一項:

  • 復制構造函數
  • 復制分配
  • 析構函數

如果您使用的是C ++ 11,則還有兩個成員:

  • 移動構造器
  • 移動分配

我建議您閱讀以下內容:

只要SomeClass實施了正確的析構函數,那里就不應有任何泄漏。

您是否實現了復制構造函數和賦值運算符? 析構函數是否清除了它擁有的所有內存?

另外,您如何知道自己正在泄漏內存。 您是在使用Valgrind或Purify之類的工具,還是只是查看內存位置?

問題是“ SomeClass”。

它很可能會分配不會在銷毀時釋放的內存。 如果您發布“ SomeClass”,IT會有所幫助

暫無
暫無

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

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