【问题标题】:How does std::map operator[] cause memory leak with fundamental data types?std::map operator[] 如何导致基本数据类型的内存泄漏?
【发布时间】:2011-06-13 11:52:24
【问题描述】:

我正在使用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) 是否会导致地图无法彻底销毁?

【问题讨论】:

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


    【解决方案1】:

    您在此处发布的代码非常好,不会导致任何泄漏,因此有几个可能的罪魁祸首:

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

    【讨论】:

    • 你和彼得的答案应该结合起来。
    • @Jonathan- 根据规范的第 18.3.8 节,“调用exit() 不会破坏自动对象。”所以是的,调用exit 将阻止析构函数运行。
    【解决方案2】:

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

    当你插入一个映射时,它需要在它的树中创建一个新节点(一个映射通常是一个red-black tree)。通常,map 会为每次插入分配动态内存,这对于原始类型、用户定义类型或指针没有什么不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 2016-01-26
      • 2014-08-18
      • 2018-09-08
      相关资源
      最近更新 更多