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

Jon*_*han 2 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

tem*_*def 8

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

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


Pet*_*der 5

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

当您插入地图时,它需要在其树中创建一个新节点(地图通常是一棵红黑树)。通常,映射将为每次插入分配动态内存,这对于原始类型、用户定义类型或指针没有什么不同。