VC++ 配列・配列オブジェクトの不正位置参照エラー 【やってみた】


参照エラー

前回配列・配列オブジェクトの参照速度について実験してみたが、今回はこれらを利用する時に、不正な位置を参照した場合どのようなエラーが出るかの実験を行ってみた。(実験では、コンパイルを基本/clrオプションで行っている。)

スポンサーリンク

MFC CArray

Visual C++のライブラリMFCCArrayを使って実験。

ArrayTest.exe の 0x7c812a5b で初回の例外が発生しました: Microsoft C++ の例外: CInvalidArgException (メモリの場所 0x0012f044)。
‘System.Runtime.InteropServices.SEHException’ の初回例外が ArrayTest.exe で発生しました。
‘System.Runtime.InteropServices.SEHException’ のハンドルされていない例外が ArrayTest.exe で発生しました。

CInvalidArgExceptionという例外が発生するようだ。

ATL CAtlArray

Visual C++のライブラリATLCAtlArrayを使って実験。

ArrayTest.exe の 0x7c812a5b で初回の例外が発生しました: Microsoft C++ の例外: COleException (メモリの場所 0x0012f048)。
‘System.Runtime.InteropServices.SEHException’ の初回例外が ArrayTest.exe で発生しました。
‘System.Runtime.InteropServices.SEHException’ のハンドルされていない例外が ArrayTest.exe で発生しました。

COleExceptionという例外が発生するようだ。

stl vector

標準C++のライブラリSTLvectorを使って実験。

Microsoft Visual Studio C ランタイム ライブラリは ArrayTest.exe に致命的なエラーを検出しました。

これ以外は特にデバッグの出力ウィンドウには表示されなかった。

C++/CLI 配列

Visual C++のC++/CLI言語で単なる配列を使って実験。

‘System.NullReferenceException’ の初回例外が ArrayTest.exe で発生しました。
‘System.NullReferenceException’ のハンドルされていない例外が ArrayTest.exe で発生しました。
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。

このときウォッチでdの値を見ると<未定義の値>となる。ちなみに、次のようなコードを書いてもコンパイルは通り、実行もされる。特にエラーは発生しない。というのも逆アセンブルするとわかるがコンパイル時にここら辺のコードは省かれるようだ。

さらに、共通言語ランタイム サポート(/clr)オプションをはずす

ArrayTest.exe の 0x00401cdd で初回の例外が発生しました: 0xC0000005: 場所 0xfffffffe に書き込み中にアクセス違反が発生しました。
ArrayTest.exe の 0x00401cdd でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xfffffffe に書き込み中にアクセス違反が発生しました。

ArrayTest.exe の 0x0041d9f4 で初回の例外が発生しました: 0xC0000005: 場所 0x00000001 に書き込み中にアクセス違反が発生しました。
ArrayTest.exe の 0x0041d9f4 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000001 に書き込み中にアクセス違反が発生しました。

このようなエラーが発生したりする。

C++/CLI array

Visual C++のC++/CLIでのarrayを使って実験。

‘System.NullReferenceException’ の初回例外が ArrayTest.exe で発生しました。
‘System.NullReferenceException’ のハンドルされていない例外が ArrayTest.exe で発生しました。
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。

ちなみに割り当ててから範囲外を参照すると先ほどとは違うエラーになる。

‘System.IndexOutOfRangeException’ の初回例外が ArrayTest.exe で発生しました。
‘System.IndexOutOfRangeException’ のハンドルされていない例外が ArrayTest.exe で発生しました。
追加情報: インデックスが配列の境界外です。

スポンサーリンク
カテゴリー: やってみた   パーマリンク

コメントは受け付けていません。