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

时间:2012-06-04 09:07:38

标签: 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 std::vector<SomeClass>();
//add some elements with vecPtr2->push_back(SomeClass());
delete vecPtr2;

据我所知,删除应该调用std :: vector的析构函数,它应该依次调用SomeClass的析构函数 - &gt;没有泄漏。我已经投入了一些思考和测试,如果我在这样的范围内使用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 个答案:

答案 0 :(得分:6)

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

std::vector<SomeClass> classes; //automatic object

无论如何,在你的情况下,我猜问题就在于课程SomeClass

我想这个类管理内存并且没有正确实现以下任何一个:

  • 拷贝构造
  • 复制指派
  • 析构

如果你正在使用C ++ 11,那么还有两个成员:

  • 将-构造
  • 将指派

我建议你阅读这些内容:

答案 1 :(得分:3)

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

您是否实施了复制构造函数和赋值运算符?析构函数是否清除了它拥有的所有内存?

另外,你怎么知道你在泄漏记忆。您使用的是像Valgrind或Purify这样的工具,还是仅仅查看内存位置?

答案 2 :(得分:0)

问题是“SomeClass”。

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

,IT会有所帮助