удаление перегрузки, чисто виртуальный вызов функции

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

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


person Community    schedule 14.01.2009    source источник
comment
некоторые примеры кода могут помочь ответить на вопрос   -  person orip    schedule 14.01.2009


Ответы (1)


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

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

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

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

person Johannes Schaub - litb    schedule 14.01.2009
comment
Я использую shared_ptr, когда он выходит за рамки, он вылетает. Я хотел, чтобы obj удалялся естественным образом с ключевым словом delete. Похоже, я не могу этого сделать. Теперь я использую shared_ptr с std :: mem_fun в качестве второго параметра везде. Это работает хорошо. - person ; 14.01.2009
comment
да, я прокомментировал, что один из парней ответил, что он вызвал удаление в дополнение к вызову deleteMe. я считал, что вы называете "удалить это"; в этой функции, поэтому он фактически вызовет delete два раза. - person Johannes Schaub - litb; 14.01.2009
comment
я рекомендовал shared_ptr ‹T› ptr (новый T, bind (& T :: deleteMe, _1)); , но затем другой парень опубликовал другой ответ, и я удалил свой комментарий. - person Johannes Schaub - litb; 14.01.2009