2013-05-10 14 views
9

、ベースの場合はdynamic_castはポインタを使用する場合に例外をスローしますか?私は以下のようないくつかのことのようにポインタをキャストするために、私の元にはdynamic_castを使用しています

Base *base = here storing the pointer; 

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

は、キャストが失敗するとNULLを返すクラス階層のポインタを持っていません。次の行ではNULLをチェックしています。だから問題はない。

私はクラッシュダンプを見つけました。私のアプリケーションは、dynamic_castスロー例外のためにクラッシュしました。

dynamic_castは参照型とともに使用された場合にのみスローされることはわかっています。

上記のソースで使用したように、dynamic_castでポインタを使用すると例外がスローされることはありますか?それ(base)に渡されたポインタが無効な場合

+0

[http://stackoverflow.com/questions/278429/what-c​​ould-cause-a-dynamic-cast-to-crash] – prasadmadanayake

答えて

4

dynamic_cast<Derived*>enter image description hereは、その動的型を知るために、それを逆参照dynamic_cast必要があるので、投げることができます。

編集:より具体的には、 dynamic_castは、ポインタとともに使用すると構造化例外(たとえばstd::bad_cast)を投げることはありませんが、無効なポインタが渡されたときにキャッチできない非構造化例外がスローされます。無効なポインタを使用すると、未定義の動作が発生します。この場合、通常、無効なメモリとクラッシュにアクセスすることになります。

質問に添付されたメモリダンプに基づいて、pInfoが無効なオブジェクトを指していることがわかります。したがって、これらのメッセージはすべて<Memory access error>です。これは、pInfoが無効なポインタであることを意味し、これがプログラムがクラッシュする理由です。どこかにバグがあり、修正する必要があります。

+0

私の分析によれば、無効の場合それはNULLを与えるポインタです。それがNULLを返す例外isteadをThrowすることができるとき。ここで無効なポインタの意味を入力してください。 –

+0

@RajeshSubramanian無効なポインタは、オブジェクトを指すポインタでもnullでもありません。 'base'が破壊されたオブジェクトを指しているか、またはオブジェクトのアドレスに初期化されていない場合、それは無効です。 – Gorpik

+0

私の場合はクラッシュダンプからオブジェクトがnullではないことがわかりました。このキャストの前に私はnullをチェックする条件があるからです。 –

11

上記のソースで使用したように、dynamic_castでポインタを使用すると例外がスローされることはありますか?

明確に定義されたプログラムでは、にはなりません。標準では、それを許可していません:

[C++11: 5.2.7/9]:ポインタ型に失敗したキャストの値が必要な結果の型のヌルポインタ値です。参照型へのキャストに失敗した場合、std::bad_cast(18.7.2)がスローされます。あなたはdynamic_cast無効なポインタを渡す場合

しかし、その後、あなたは、いくつかの実装定義C++の例外、または実行時のクラッシュを含め、発生する可能性があり未定義の動作を呼び出します。

関連する問題