2012-06-04 324 views
1

我有以下问题:内存泄漏

当我使用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; 
} 
+2

你如何检测内存泄漏?更重要的是,你必须给你一些'SomeClass'的代码,因为构造函数和析构函数的实现可能会导致意外的内存行为 – weidi

+0

@weidi首先,我只看了一下ps的内存使用情况(坏的,我知道)。 'Valgrind --tool = memcheck --leak-check = yes'告诉我不要担心总堆使用率:109个分配,109个释放,7,506个字节分配。但是,如果我运行程序一次,直到“_Deleted vector_”,然后启动第二个实例,linux开始填充交换,这对我的理解意味着内存仍在使用中。 – denahiro

+0

“但是如果我运行程序一次,直到”已删除的矢量“,然后启动第二个实例,linux开始填充交换,这对我的理解意味着内存仍在使用中。” - 你的初始假设是不正确的。不要将内存管理与操作系统的内存管理混为一谈。 – Joe

回答

6

首先,你不应该创建矢量对象动态。这是一个糟糕的主意。也就是说,使用自动向量:

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

不管怎样,在你的情况,我想问题在于类SomeClass

我想这个类管理内存,并没有实现下列正确的至少一个:

  • 拷贝构造
  • 拷贝赋值
  • 析构函数

如果”重新使用C++ 11,那么还有两个成员:

  • 移动构造函数
  • 布展分配

我建议你阅读这些:

3

应该不会出现任何有泄漏,如果SomeClass提供了正确的析构函数。

你有拷贝构造函数和赋值操作符吗?析构函数是否清除它拥有的全部内存?

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

0

问题是“SomeClass”。

它很可能会分配不破坏释放的内存。 如果你发布你的“SomeClass”,它会有所帮助