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