c++ - 将 std::vector 与类元素一起使用时发生内存泄漏

标签 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;

据我所知,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;
}

最佳答案

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

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

无论如何,在您的情况下,我猜问题出在 SomeClass 类上。

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

  • 复制构造函数
  • 复制作业
  • 析构函数

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

  • 移动构造函数
  • 移 Action 业

我建议你阅读这些:

关于c++ - 将 std::vector 与类元素一起使用时发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10878811/

相关文章:

delphi - FastMM 无法检测内存泄漏

c++ - valgrind 疯了还是这是真正的 std 映射迭代器内存泄漏?

c++ - erase 获取 const_iterator 但使用迭代器调用(非 const)

c++ - 如何在 c++11/c++14 中定义一个以枚举为键、以整数为值的映射?

java - 在 C++ 程序中使用 Java 小程序

c++ - 重新排列已排序的数组

database - 内存泄漏: How to stop?

c++ - boost::asio,异步读取错误

c++ - 有趣的 std::copy 从 std::vector 到 std::string 的行为

c++ - 将 RVO 对象传递给 std::vector::emplace_back