Для простого класса:
class X {
public:
//...
private:
int *ptr;
};
X::~X() {
delete ptr;
}
Я написал деструктор, чтобы освободить память, на которую указывает ptr
. Теперь я задаюсь вопросом, если мой деструктор остается, как это, когда ptr
фактически уничтожены?
благодаря
delete
вызывает деструктор объекта, который удаляется, а затем освобождает занятую память.
Я думаю, что эта статья может ответить на большинство ваших вопросов
"Деструкторы неявно называются, когда автоматический объект (локальный объект, который был объявлен автоматически или зарегистрирован или не объявлен как статический или внешний) или временный объект, выходит из области действия. Они неявно вызываются при завершении программы для построенных внешних и статических объектов Деструкторы вызывается, когда вы используете оператор delete для объектов, созданных с помощью нового оператора. "
Более конкретно:
"Деструкторы базовых классов и членов вызываются в обратном порядке завершения их конструктора:
Деструктор для объекта класса вызывается перед вызовом деструкторов для членов и баз.
Деструкторы для нестатических членов вызываются перед вызовом деструкторов для базовых классов.
Деструкторы для невиртуальных базовых классов вызывается перед вызовом деструкторов для виртуальных базовых классов. "
Деструктор вызовет в конце области действия, где находится конкретный экземпляр.
delete
.
delete
динамический экземпляр? это своего рода «конец области видимости» ... tnx для вашей коррекции!
Локальная версия ptr для данного экземпляра X будет уничтожена, когда объект выходит за рамки. Например:
int main()
{
X obj;
for (int i=0; i<10; i++) {
X tmp;
// do work with tmp
...
// tmp goes out of scope here
// the destructor tmp::~X will be called here, immediately after each iteration ends
}
// obj goes out of scope here
// the destructor obj::~X called when the program ends
}
X
, содержащийptr
, уничтожается сам.