перегрузка delete, чистый виртуальный вызов func - PullRequest
1 голос
/ 14 января 2009

Итак, я хочу перегрузить удаление абстрактного виртуального класса. Это вызовет deleteMe () в производном классе, который находится в другой библиотеке. Это сделано для предотвращения ошибок / сбоев, упомянутых здесь C ++ mix new / delete между библиотеками?

когда я звоню удалить меня из удаления в моем базовом классе, я получаю ошибку «чисто виртуальный вызов func». Тогда я узнаю, что он уже вызвал мой дтор. Как перегрузить удалить или написать этот код таким образом, чтобы он не вызывал dtor, чтобы я мог написать delete obj; и он вызывает obj-> deleteMe (), который затем вызывает собственную функцию удаления и dtor?

1 Ответ

6 голосов
/ 14 января 2009

Звучит так, будто вы используете оператор delete как обычную функцию, которая должна делать произвольные вещи. Оператор delete, однако, предназначен только для освобождения памяти, выделенной ему в качестве первого аргумента, который является указателем на эту область памяти.

Этот указатель будет указывать на область памяти, где находился ваш объект. В это время, однако, деструктор вашего объекта уже запущен, и ваш объект больше не существует. Вы вообще не можете вызывать какие-либо функции-члены, даже виртуальные функции!

У меня такое ощущение, что цель оператора удалить неправильно. Если вы вызываете delete pointer, компилятор вызывает деструктор для объекта, а затем вызывает функцию освобождения, чтобы освободить выделенную память, которая называется operator delete.

Ну, почему бы не использовать решение, которое мы показали вам ранее, с boost::shared_ptr?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...