Когда dynamic_cast выдаст исключение в случае использования с указателем?

Я использую dynamic_cast в моем источнике, чтобы привести указатель, как некоторые вещи, как показано ниже,

Base *base = here storing the pointer;

Derived *derived = dynamic_cast<Derived*>(base);

В случае base нет указателя иерархии классов, тогда приведение завершится неудачно и вернет NULL. В следующих строках я проверяю NULL. Так что никаких проблем.

Я столкнулся с дампом сбоя, мое приложение упало из-за исключения throws dynamic_cast.

Я знаю, что dynamic_cast генерирует только при использовании со ссылочными типами.

Любая идея, когда dynamic_cast может генерировать исключение при использовании с указателем, как я использовал в приведенном выше источнике?введите описание изображения здесь

9

Решение

Любая идея, когда dynamic_cast может генерировать исключение при использовании с указателем, как я использовал в приведенном выше источнике?

В четко определенной программе это не может. Стандарт не позволяет этого:

[C++11: 5.2.7/9]: Значение неудачного приведения к типу указателя является нулевым значением указателя требуемого типа результата. Неудачное приведение к броскам ссылочного типа std::bad_cast (18.7.2).

Однако, если вы пройдете dynamic_cast неверный указатель, тогда вы вызываете неопределенное поведение а также что-нибудь может произойти, в том числе некоторые определенные реализацией исключения C ++, или сбой во время выполнения.

12

Другие решения

dynamic_cast<Derived*> может скинуть, если на него передан указатель (base) недействителен, так как dynamic_cast необходимо разыменовать его, чтобы узнать его динамический тип.

РЕДАКТИРОВАТЬ: чтобы быть более конкретным. dynamic_cast никогда не сгенерирует структурированное исключение (std::bad_cast, например) при использовании с указателями, но, вероятно, вызовет неструктурированное исключение, которое вы не сможете отловить при передаче неверного указателя. Использование недействительных указателей вызывает неопределенное поведение, которое в этом случае обычно означает доступ к недопустимой памяти и сбой.

Исходя из дампа памяти, который вы прикрепили к вашему вопросу, становится ясно, что pInfo указывает на недопустимый объект, следовательно, все те <Memory access error> Сообщения. Это означает, что pInfo неверный указатель, и это причина, по которой ваша программа падает. У вас есть ошибка где-то, и вам придется ее исправить.

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector