【问题标题】:Memory leak when using std::vector with class elements将 std::vector 与类元素一起使用时的内存泄漏
【发布时间】:2012-06-04 09:07:38
【问题描述】:

我有以下问题:

当我使用带有内置函数的 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;

据我了解,delete 应该调用 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;
}

【问题讨论】:

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

标签: c++ memory-leaks stdvector


【解决方案1】:

首先,你不应该动态地创建向量对象。这简直是​​个坏主意。即使用自动向量:

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

无论如何,在你的情况下,我想问题出在SomeClass这个类上。

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

  • 复制构造函数
  • 复制分配
  • 析构函数

如果您使用的是 C++11,那么还有两个成员:

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

我建议您阅读以下内容:

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      问题是“SomeClass”。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-19
        • 2016-05-01
        • 2016-02-07
        • 2018-05-09
        相关资源
        最近更新 更多