我有以下问题:
当我使用带有内置的 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 的析构函数,而 std::vector 又应该调用 SomeClass 的析构函数 ->没有泄漏。我已经对此进行了一些思考和测试,如果我在如下所示的范围内使用 std::vector,也会发生相同的行为:
{
std::vector<SomeClass> vector;
//add elements as before
}
//memory is still used here
我在 Ubuntu 4.6.10 下使用 gcc 11.10。我的库中有什么问题,还是我对 std::vector 如何破坏元素有误解?
为了澄清起见,我使用 SomeClass 的完整代码替换为 std::p air(是的,我知道某些部分被黑客入侵,但这只是一个例子):
#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,则还有两个成员:
- 移动构造函数
- 移动分配
我建议您阅读以下内容:
- 什么是三法则?
- 三法则变成了五法则与C++11?
那里不应该有任何泄漏,只要SomeClass
实现了正确的析构函数。
是否实现了复制构造函数和赋值运算符?析构函数是否清除了它拥有的所有内存?
另外,你怎么知道你正在泄漏内存。您使用的是Valgrind或Purify之类的工具,还是仅查看内存位置?
问题是"SomeClass"。
它很可能会分配在销毁时不会释放的内存。如果您发布"SomeClass",它会有所帮助