Как оператор std :: map [] вызывает утечку памяти с основными типами данных? - PullRequest
2 голосов
/ 22 января 2011

Я использую Визуальный детектор утечек для обнаружения утечек памяти и обнаружил много случаев утечек памяти в таких строках, как:

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 ]

8 голосов
/ 22 января 2011

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

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

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

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

...