我有以下问题:内存泄漏
当我使用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;
}
你如何检测内存泄漏?更重要的是,你必须给你一些'SomeClass'的代码,因为构造函数和析构函数的实现可能会导致意外的内存行为 – weidi
@weidi首先,我只看了一下ps的内存使用情况(坏的,我知道)。 'Valgrind --tool = memcheck --leak-check = yes'告诉我不要担心总堆使用率:109个分配,109个释放,7,506个字节分配。但是,如果我运行程序一次,直到“_Deleted vector_”,然后启动第二个实例,linux开始填充交换,这对我的理解意味着内存仍在使用中。 – denahiro
“但是如果我运行程序一次,直到”已删除的矢量“,然后启动第二个实例,linux开始填充交换,这对我的理解意味着内存仍在使用中。” - 你的初始假设是不正确的。不要将内存管理与操作系统的内存管理混为一谈。 – Joe