[英]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.