Учитывая указатель (p
) на динамически размещенный объект, delete
делает две вещи:
- Вызывает деструктор динамически размещаемого объекта. Обратите внимание, что когда
~MyClass()
завершается, вызывается деструктор для любых переменных-членов типа класса.
- Освобождает память, занятую динамически распределяемым объектом.
Он не ищет переменные-члены объекта для других указателей на освобождение; он не освобождает другую память и больше ничего не делает.
Если вам нужно освободить память, указанную intArray
, вам нужно delete
в деструкторе MyClass
.
Однако почти во всем коде C ++ вам не нужно об этом беспокоиться. Вы должны использовать умные указатели, такие как shared_ptr
, unique_ptr
, auto_ptr
и scoped_ptr
для автоматического управления динамически размещаемыми объектами. Ручное управление ресурсами в лучшем случае затруднено, и его следует избегать везде, где это возможно.
Это часть более широкой идиомы «Управление ресурсами, ограниченным областью действия» (SBRM, также называемый «Получение ресурсов - инициализация» или RAII). Это, безусловно, самый важный шаблон проектирования, который нужно понимать и использовать везде в коде C ++.
Если в вашем классе вы объявили это вместо:
boost::scoped_ptr<int> intArray;
затем, когда объект scoped_ptr<int>
будет уничтожен, он освободит указатель, который он содержит. Тогда вам не нужно выполнять какую-либо работу, чтобы уничтожить объект вручную.
В хорошо написанном, современном коде C ++ вам редко нужно вручную использовать delete
. Умные указатели и другие контейнеры SBRM должны использоваться для управления любым типом ресурсов, требующих очистки, включая динамически размещаемые объекты.
Во втором примере приведен связанный список, который выглядит следующим образом:
x -> y -> z -> 0
у вас будет порядок операций, который выглядит следующим образом:
delete x;
x.~MyClass();
delete y;
y.~MyClass();
delete z;
z.~MyClass();
delete 0;
[free memory occupied by z]
[free memory occupied by y]
[free memory occupied by x]
Объекты в связанном списке будут уничтожены в обратном порядке.