Что такое утечка памяти в C++?

«Что такое утечка памяти в C++?» — вопрос из категории Управление памятью, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Утечка памяти — это ситуация, когда программа выделяет память (например, оператором new или функцией malloc), но не освобождает её (оператором delete или функцией free), и при этом теряются все указатели на эту область памяти. В результате эта память остается занятой до завершения работы программы.

Классический пример утечки:

void createLeak() {
    int* dynamicArray = new int[1000]; // Выделение памяти
    // ... использование массива ...
    // Забыли выполнить delete[] dynamicArray;
    // После выхода из функции указатель dynamicArray уничтожается,
    // а память на 1000 int остаётся занятой и недоступной.
}

Более коварный пример через исключение:

void riskyFunction() {
    int* ptr = new int(42);
    someFunctionThatMightThrow(); // Если исключение выброшено здесь,
    delete ptr;                   // эта строка не выполнится.
}

Как предотвращать утечки в современном C++:

  1. Использовать умные указатели (RAII):
    #include <memory>
    void safeFunction() {
        auto ptr = std::make_unique<int>(42); // std::unique_ptr
        // Память будет автоматически освобождена при выходе из области видимости,
        // даже если будет выброшено исключение.
    }
  2. Использовать контейнеры STL: Вместо ручного управления массивами используйте std::vector, std::string и т.д.
  3. Следовать правилу "пяти/нуля" (Rule of Five/Zero): Корректно определять или запрещать специальные функции-члены для классов, управляющих ресурсами.
  4. Использовать инструменты для обнаружения:
    • Санитайзеры (GCC/Clang): -fsanitize=address
    • Valgrind (Memcheck)
    • Встроенные средства IDE (Visual Studio Debugger, Qt Creator)

Циклические ссылки с std::shared_ptr — особая форма утечки, решаемая с помощью std::weak_ptr.