Я использую dynamic_cast в моем источнике, чтобы привести указатель, как некоторые вещи, как показано ниже,
Base *base = here storing the pointer;
Derived *derived = dynamic_cast<Derived*>(base);
В случае base нет указателя иерархии классов, тогда приведение завершится неудачно и вернет NULL. В следующих строках я проверяю NULL. Так что никаких проблем.
Я столкнулся с дампом сбоя, мое приложение упало из-за исключения throws dynamic_cast.
Я знаю, что dynamic_cast генерирует только при использовании со ссылочными типами.
Любая идея, когда dynamic_cast может генерировать исключение при использовании с указателем, как я использовал в приведенном выше источнике?
Любая идея, когда dynamic_cast может генерировать исключение при использовании с указателем, как я использовал в приведенном выше источнике?
В четко определенной программе это не может. Стандарт не позволяет этого:
[C++11: 5.2.7/9]:
Значение неудачного приведения к типу указателя является нулевым значением указателя требуемого типа результата. Неудачное приведение к броскам ссылочного типаstd::bad_cast
(18.7.2).
Однако, если вы пройдете dynamic_cast
неверный указатель, тогда вы вызываете неопределенное поведение а также что-нибудь может произойти, в том числе некоторые определенные реализацией исключения C ++, или сбой во время выполнения.
dynamic_cast<Derived*>
может скинуть, если на него передан указатель (base
) недействителен, так как dynamic_cast
необходимо разыменовать его, чтобы узнать его динамический тип.
РЕДАКТИРОВАТЬ: чтобы быть более конкретным. dynamic_cast
никогда не сгенерирует структурированное исключение (std::bad_cast
, например) при использовании с указателями, но, вероятно, вызовет неструктурированное исключение, которое вы не сможете отловить при передаче неверного указателя. Использование недействительных указателей вызывает неопределенное поведение, которое в этом случае обычно означает доступ к недопустимой памяти и сбой.
Исходя из дампа памяти, который вы прикрепили к вашему вопросу, становится ясно, что pInfo
указывает на недопустимый объект, следовательно, все те <Memory access error>
Сообщения. Это означает, что pInfo
неверный указатель, и это причина, по которой ваша программа падает. У вас есть ошибка где-то, и вам придется ее исправить.