Как и стандартный случай вызова виртуальной функции из конструктора или деструктора объекта с чисто виртуальными функциями вы также можете получить вызов чисто виртуальной функции (на MSVC по крайней мере), если вы звоните виртуальный после уничтожения объекта. Очевидно, что это очень плохо, чтобы попытаться это сделать, но если вы работаете с абстрактными классами как интерфейсами, и вы беспорядок, то это то, что вы можете видеть. Вероятнее всего, если вы используете ссылочные интерфейсы, и у вас есть ошибка подсчета ссылок или если у вас есть условие гонки на использование объекта/объекта в многопоточной программе ... Дело в таких чистых очках заключается в том, что это часто менее легко понять, что происходит, так как проверка «обычных подозреваемых» виртуальных вызовов в ctor и dtor будет чистой.
Чтобы помочь в отладке этих проблем, вы можете в различных версиях MSVC заменить обработчик purecall библиотеки времени выполнения. Вы делаете это, предоставляя свои собственные функции этой подписью:
и связывая его перед связыванием библиотеки времени выполнения. Это дает вам контроль над тем, что происходит при обнаружении чистокровки. Как только вы получите контроль, вы можете сделать что-то более полезное, чем стандартный обработчик. У меня есть обработчик, который может обеспечить трассировку стека, где произошел чистокровка; см. здесь: http://www.lenholgate.com/blog/2006/01/purecall.html для более подробной информации.
(Обратите внимание, что вы также можете вызвать _set_purecall_handler() для установки вашего обработчика в некоторых версиях MSVC).
Любые причины, по которым компилятор не мог поймать это, в общем? – Thomas 2008-09-19 04:15:10