2011-01-21 2 views
2

Я использую Visual Leak Detector для обнаружения утечек памяти, и столкнулся с множеством случаев утечек памяти в линиях, такие как:Как std :: map operator [] вызывает утечку памяти с фундаментальными типами данных?

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), чтобы карта не была полностью разрушена?

ответ

8

код Вы разместили здесь совершенно нормально и не должно вызывать каких-либо утечек, поэтому есть несколько возможных виновники:

  1. Некоторые реализации STL использовать пользовательские распределители, которые сохраняют динамически распределяемой памяти без освобождения для ускорения будущих распределений. Возможно, у вас есть такая реализация и что она использует эту оптимизацию, которая будет выглядеть как утечка с точки зрения проверки памяти.
  2. Если программа завершается ненормально, то деструктор map (или любой объект-деструктор, если на то пошло) не будет вызываться, что, безусловно, вызовет утечку памяти.
+0

Вы должны ответить на ответ Питера. – Omnifarious

+0

Выключить (1) команду вызвать такое ненормальное завершение? – Jonathan

+1

@ Джонатан. Согласно разделу 18.3.8 спецификации «Автоматические объекты не уничтожаются в результате вызова' exit() '." Так что да, вызов 'exit' предотвратит запуск деструктора. – templatetypedef

4

Там нет утечки памяти, но есть экземпляры.

При вставке в карту необходимо создать новый узел в своем дереве (карта обычно равна red-black tree). Как правило, карта будет выделять динамическую память для каждой вставки, и это не отличается для примитивных типов, определяемых пользователем типов или указателей.