Удаление класса и указателя

0

У меня вопрос об удалении объекта и указателей на них. Первый тест:

  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);

Это потому, что в этом примере используется куча, первый пример использует стек?

Теги:
pointers

2 ответа

1
Лучший ответ

Поскольку ваш объект находится в стеке, его деструктор будет вызываться, когда этот объект выйдет из области действия.

Вы удаляете один раз, и компилятор неявно вызывает деструктор в другое время.

Вот почему деструктор называется дважды.

Однако поведение такой программы не определено и должно быть готово к любому побочному эффекту двойного удаления.

  • 0
    Понятно! Спасибо за ответ.
1

Объект не был выделен с помощью new, поэтому это неопределенное поведение для вызова delete. Просто позвольте этому выйти из области действия, и деструктор будет вызван автоматически (второй вызов в вашем примере).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню