C++ 将std::vector与类元素一起使用时内存泄漏

C++ 将std::vector与类元素一起使用时内存泄漏,c++,memory-leaks,stdvector,C++,Memory Leaks,Stdvector,我有以下问题: 当我使用内置的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 s

我有以下问题:

当我使用内置的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*vecPtr1=新的std::vector();
//添加一些元素
删除vecPtr1;
//泄漏一些内存,但不是全部
std::vector*vecPtr2=新的std::vector();
//使用vecPtr2->push_back(SomeClass())添加一些元素;
删除vecPtr2;
据我所知,delete应该调用std::vector的析构函数,后者应该调用SomeClass->no leak的析构函数。我对此进行了一些思考和测试,如果在如下范围内使用std::vector,同样的行为也会发生:

{
  std::vector<SomeClass> vector;
  //add elements as before
}
//memory is still used here
{
std::向量;
//像以前一样添加元素
}
//这里仍然使用内存
我在Ubuntu11.10下使用GCC4.6.1。我的库有什么问题吗?或者我对std::vector如何破坏元素有误解吗

为了澄清,我用std::pair替换了SomeClass的完整代码(是的,我知道一些部分被黑客攻击,但这只是一个示例):

#包括
#包括
#包括
int main()
{
标准:字符串指令;

std::cout首先,您不应该动态创建向量的对象。这只是一个坏主意。也就是说,使用自动向量:

std::vector<SomeClass> classes; //automatic object
std::vector类;//自动对象
无论如何,在您的情况下,我想问题在于类
SomeClass

我猜这个类管理内存,但至少没有正确实现以下一项:

  • 复制构造函数
  • 复印作业
  • 析构函数
如果您使用的是C++11,那么还有两个成员:

  • 移动构造函数
  • 移动分配
我建议您阅读以下内容:


首先,您不应该动态创建向量对象。这只是一个坏主意。也就是说,使用自动向量:

std::vector<SomeClass> classes; //automatic object
std::vector类;//自动对象
无论如何,在您的情况下,我想问题在于类
SomeClass

我猜这个类管理内存,但至少没有正确实现以下一项:

  • 复制构造函数
  • 复印作业
  • 析构函数
如果您使用的是C++11,那么还有两个成员:

  • 移动构造函数
  • 移动分配
我建议您阅读以下内容:


如果
SomeClass
实现了正确的析构函数,则不应存在任何泄漏

是否实现了复制构造函数和赋值运算符?析构函数是否正在清除其拥有的所有内存


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

如果
SomeClass
实现了正确的析构函数,那么那里不应该有任何泄漏

是否实现了复制构造函数和赋值运算符?析构函数是否正在清除其拥有的所有内存

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

问题是“SomeClass”

它很可能会分配在销毁时不会释放的内存。 如果你发布你的“SomeClass”将会有所帮助。

问题是“SomeClass”

它很可能会分配在销毁时不会释放的内存。
如果你发布你的“SomeClass”

你如何检测内存泄漏?更重要的是,你必须给出你的一些代码
SomeClass
,因为构造函数和析构函数的实现可能会导致意外的内存behavior@weidi首先,我只是看了一下ps的内存使用情况(我知道这很糟糕)“Valgrind--tool=memcheck--leak check=yes”告诉我不要担心“总堆使用率:109个allocs,109个frees,7506个字节分配”。但是如果我运行一次程序直到“Deleted vector”,然后启动第二个实例,linux就会开始填充交换,这就我的理解而言意味着内存仍然在使用中。“但是如果我运行一次程序直到”“删除向量”,然后启动第二个实例,linux开始填充交换,据我所知,这意味着内存仍在使用中-您的起始假设不正确。请不要将内存管理与操作系统的内存管理混淆。如何检测内存泄漏?更重要的是,您必须给出一些代码
SomeClass
,因为构造函数和析构函数的实现可能会导致意外内存behavior@weidi首先我只看了一下ps的内存使用情况(我知道很糟糕)。“Valgrind--tool=memcheck--leak check=yes”告诉我不要担心“总堆使用率:109个allocs,109个frees,7506个字节分配”。但是如果我运行一次程序直到“Deleted vector”然后启动第二个实例,linux开始填充交换,据我所知,这意味着内存仍在使用。”但如果我运行一次程序,直到“删除向量”,然后启动第二个实例,linux开始填充交换,据我所知,这意味着内存仍在使用。”-您的起始假设不正确。请不要将内存管理与操作系统的内存管理混淆。