std :: map operator []如何导致基本数据类型的内存泄漏?

时间:2011-01-21 23:41:33

标签: c++ memory-leaks stdmap memory-leak-detector

我正在使用Visual Leak Detector来检测内存泄漏,并且在以下行中遇到了许多内存泄漏事件:

class SomeClass
{
    // ...
    std::map<long,long> some_map;

    void func(long a_long, long b_long)
    {
        some_map[a_long] = b_long;  // here be a memory leak
    }
}

这怎么可能?这里没有指针,没有对象实例化。

这可能是内存泄漏导致程序因其他原因而崩溃的副作用吗?程序崩溃或退出(1)会导致地图不被彻底破坏吗?

2 个答案:

答案 0 :(得分:8)

你在这里发布的代码非常好,不应该造成任何泄密,所以有一些可能的罪魁祸首:

  1. 一些STL实现使用自定义分配器来保留动态分配的内存而不释放它,以便更快地进行将来的分配。您可能有这样的实现,并且正在使用此优化,从内存检查器的角度来看,这看起来像是泄漏。
  2. 如果程序异常终止,则不会调用map析构函数(或任何对象析构函数),这肯定会导致内存泄漏。

答案 1 :(得分:4)

那里没有内存泄漏,但有实例化。

当您插入地图时,它需要在其树中创建一个新节点(地图通常是red-black tree)。通常,映射将为每次插入分配动态内存,这对于基本类型,用户定义类型或指针也没有区别。