我有以下问题:
当我使用带内置函数的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 :: 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;
}
3 回答
首先,您不应该动态创建矢量对象 . 这简直是一个坏主意 . 也就是说,使用自动向量:
无论如何,在你的情况下,我猜问题在于
SomeClass
类 .我想这个类管理内存并且没有正确实现以下至少一个:
复制构造函数
复制分配
析构函数
如果您使用的是C 11,那么还有两个成员:
移动构造函数
移动分配
我建议你阅读这些内容:
What is The Rule of Three?
Rule-of-Three becomes Rule-of-Five with C++11?
如果
SomeClass
实现了正确的析构函数,那么不应该有任何泄漏 .您是否实现了复制构造函数和赋值运算符?析构函数是否清除了它拥有的所有内存?
另外,你怎么知道你正在泄漏记忆 . 您使用的是像Valgrind或Purify这样的工具,还是仅仅查看内存位置?
问题是“SomeClass” .
它很可能会分配在销毁时不释放的内存 . 如果您发布“SomeClass”,IT会有所帮助