2

我正在使用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)会导致地图没有被彻底破坏吗?

4

2 回答 2

8

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

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

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

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

于 2011-01-21T23:54:51.623 回答