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