У меня вопрос об удалении объекта и указателей на них. Первый тест:
a test;
a* test_ptr;
test_ptr = &test;
test.aPrint();
test_ptr->aPrint();
delete(test_ptr);
test.aPrint();
Я добавил распечатку в конструкторе, деструкторе и функции. APrint печатает текст "aPrint" (ob).
constructor
aPrint
aPrint
destructor
aPrint
destructor
Как я могу дважды позвонить деструктору? И как я могу использовать тест объекта после удаления?
-----редактировать-----
Поэтому, если я вместо этого использую новый. Затем я должен использовать delete, иначе я получил утечку.
a* test_ptr;
test_ptr = new a;
test_ptr->aPrint();
delete(test_ptr);
Это потому, что в этом примере используется куча, первый пример использует стек?
Поскольку ваш объект находится в стеке, его деструктор будет вызываться, когда этот объект выйдет из области действия.
Вы удаляете один раз, и компилятор неявно вызывает деструктор в другое время.
Вот почему деструктор называется дважды.
Однако поведение такой программы не определено и должно быть готово к любому побочному эффекту двойного удаления.
Объект не был выделен с помощью new
, поэтому это неопределенное поведение для вызова delete
. Просто позвольте этому выйти из области действия, и деструктор будет вызван автоматически (второй вызов в вашем примере).