Страницы

Поиск по вопросам

понедельник, 12 ноября 2018 г.

Возможные причины появления Debug Error - R6025 pure virtual function call

Моя программа завершает своё выполнение с ошибкой:
R6025 pure virtual function call.
Как вообще такое возможно, чтобы была вызвана чисто виртуальная функция? Экземпляр абстрактного класса не может быть создан. Если функция виртуальная, то используется позднее связывание, т.е. вызываться должна функция по типу объекта, а не по типу ссылки. Т.е. чисто виртуальная функция не может быть вызвана. Что мне делать?


Ответ

В ответе @AnT было объяснено, как может получиться такая ошибка. (Это вызов виртуальной функции, прямо или косвенно, в конструкторе или деструкторе.)
Теперь вопрос в том, что делать.
Для начала, попробуйте воспроизвести проблему под отладчиком. Microsoft советует заменить абстрактный метод на вызов DebugBreak, или запустить из-под отладчика и установить точки останова на _purecall в PureVirt.c. Но у меня проблема отловилась в Visual Studio 2015 и без этих заклинаний.
Вы увидите в стеке, какой именно абстрактный метод вы вызываете, и поискав по стеку конструктор или деструктор объекта данного класса, найдёте ошибочный вызов. Помните, что это вполне может быть косвенный вызов, через другие функции.
Если вам в конструкторе реально понадобился виртуальный метод, возможно, ваш конструктор делает слишком много. Может быть, имеет смысл вынести функциональность, требующую виртуальной функции, в отдельный метод, а конструктор закрыть, и конструировать класс через статическую фабричную функцию.
Ещё одной причиной данной ошибки может служить вызов функции по указателю на уже умерший объект. Если деструктор объекта отработал, то при условии, что память, занимаемая объектом, никем не затёрта, при попытке вызова метода по мёртвому указателю будет также выполнен чисто виртуальный метод (эта ситуация аналогична вызову метода в деструкторе), с понятными последствиями. Так что если в вашем стеке нету конструктора/деструктора, всё куда хуже: у вас умер указатель.

Комментариев нет:

Отправить комментарий