у меня есть auto_ptr<IFoo>
, где IFoo
интерфейс только с чисто виртуальными методами
Теперь у меня также есть файл core после ошибки сегментации, где я действительно хотел бы знать, что за конкретный подкласс скрывался за этим auto_ptr. Как dynamic_cast
работает в проекте, я думаю, что RTTI должен быть как-то доступен, но я не знаю, как я мог бы получить доступ к этой информации через gdb
?
Вывод, который я получаю, выглядит следующим образом:
(gdb) print this->obj._M_ptr
$22 = (class martin::IFoo *) 0x7418
Что бы я действительно хотел знать, если указатель принадлежит IBar
или IBaz
,
Спасибо за любую помощь!
Что бы я действительно хотел знать, если указатель принадлежит IBaror или IBaz
GDB должен быть в состоянии сказать вам это. использование (gdb) set print object on
, Документация Вот.
При отображении указателя на объект указывайте фактическое (производное)
тип объекта, а не объявленный тип, используя виртуальный
таблица функций. Обратите внимание, что требуется таблица виртуальных функций — это
функция может работать только для объектов, имеющих тип времени выполнения
удостоверение личности; один виртуальный метод в объявленном типе объекта
достаточно.
Обновить:
он выводит только интерфейс IFoo *
Это, вероятно, означает, что указатель действительно указывает на IFoo
(например, объект, который имел тип IBar
или же IBaz
уже был разрушен).
Будет работать с dynamic_cast подразумевать
Да, dynamic_cast
не может работать без RTTI; если вы используете dynamic_cast
, print object on
должен просто работать.
Других решений пока нет …