Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When dynamic_cast will throw exception in case used with pointer?

I am using dynamic_cast in my source to cast pointer as some thing like below,

Base *base = here storing the pointer;

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

In the case of base doesn't have the pointer of the class hierarchy then cast fails and returns NULL. In next lines I am checking NULL. So no issues.

I came across a crash dump, my application crashed due to the dynamic_cast throws exception.

I know dynamic_cast will throw only when used with reference types.

Any idea when the dynamic_cast can throw exception when used with pointer as I used in above source?enter image description here

like image 273
Rajesh Subramanian Avatar asked May 10 '13 06:05

Rajesh Subramanian


2 Answers

Any idea when the dynamic_cast can throw exception when used with pointer as I used in above source?

In a well-defined program, it cannot. The standard does not allow it:

[C++11: 5.2.7/9]: The value of a failed cast to pointer type is the null pointer value of the required result type. A failed cast to reference type throws std::bad_cast (18.7.2).

However, if you pass dynamic_cast an invalid pointer, then you invoke undefined behaviour and anything may happen, including some implementation-defined C++ exception, or a runtime crash.

like image 107
Lightness Races in Orbit Avatar answered Sep 26 '22 01:09

Lightness Races in Orbit


dynamic_cast<Derived*> can throw if the pointer passed to it (base) is invalid, since dynamic_cast needs to dereference it in order to know its dynamic type.

EDIT: To be more specific. dynamic_cast will never throw a structured exception (std::bad_cast, for instance) when used with pointers, but it will probably throw an unstructured exception that you cannot catch when passed an invalid pointer. Using invalid pointers causes undefined behaviour, which in this case usually means access to invalid memory and a crash.

Based on the memory dump you have attached to your question, it is clear that pInfo points to an invalid object, hence all those <Memory access error> messages. This means that pInfo is an invalid pointer and this is the reason why your program crashes. You have a bug somewhere and you will have to fix it.

like image 39
Gorpik Avatar answered Sep 23 '22 01:09

Gorpik