Динамическая память в 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 повторно
Поддержать проект