Динамическая память в C++: new и delete
Динамическая память в C++: выделение через new, освобождение через delete и как не допустить утечку.
Куча (heap) — это область памяти, где объекты живут, пока их явно не удалят. Память из кучи запрашивают оператором new и возвращают оператором delete.
new и delete
new выделяет память в куче и возвращает указатель; delete освобождает её.
#include <iostream>
using namespace std;
int main() {
int* p = new int(42); // выделяем один int в куче
cout << *p << "\n";
delete p; // освобождаем память
p = nullptr; // обнуляем, чтобы не было «висячего» указателя
return 0;
}Вывод:
42
Динамический массив
Для массива в куче используют new[], а освобождают строго через delete[].
#include <iostream>
using namespace std;
int main() {
int n = 3;
int* arr = new int[n]; // массив из n элементов
for (int i = 0; i < n; i++) arr[i] = i * 10;
for (int i = 0; i < n; i++) cout << arr[i] << " ";
cout << "\n";
delete[] arr; // именно delete[], не delete
return 0;
}Вывод:
0 10 20
Утечки памяти
Если забыть delete, память останется занятой до конца работы программы — это утечка. Каждому new должен соответствовать delete, а каждому new[] — delete[]. В современном C++ ручное управление памятью стараются заменять умными указателями.
Коротко
- new выделяет память в куче и возвращает указатель; delete освобождает.
- Массив: new[] выделяет, delete[] освобождает — пары нельзя путать.
- Пропущенный delete = утечка памяти; после delete обнуляйте указатель.
Проверьте себя
1. Чем освобождать память, выделенную через new int[n]?
Adelete
Bdelete[]
Cfree
Dremove
2. Что произойдёт, если ни разу не вызвать delete для выделенной памяти?
AОшибка компиляции
BПамять освободится сама сразу
CУтечка памяти
DПрограмма не запустится
3. Зачем после delete писать p = nullptr;?
AЧтобы ускорить программу
BЧтобы не осталось висячего указателя на освобождённую память
CЭто обязательно по стандарту
DЧтобы вызвать delete повторно