参照エラー
前回配列・配列オブジェクトの参照速度について実験してみたが、今回はこれらを利用する時に、不正な位置を参照した場合どのようなエラーが出るかの実験を行ってみた。(実験では、コンパイルを基本/clrオプションで行っている。)
MFC CArray
Visual C++のライブラリMFCのCArrayを使って実験。
1 2 |
CArray < int > a; a[ 0 ] = 0; |
ArrayTest.exe の 0x7c812a5b で初回の例外が発生しました: Microsoft C++ の例外: CInvalidArgException (メモリの場所 0x0012f044)。
‘System.Runtime.InteropServices.SEHException’ の初回例外が ArrayTest.exe で発生しました。
‘System.Runtime.InteropServices.SEHException’ のハンドルされていない例外が ArrayTest.exe で発生しました。
CInvalidArgExceptionという例外が発生するようだ。
ATL CAtlArray
Visual C++のライブラリATLのCAtlArrayを使って実験。
1 2 |
CAtlArray < int > b; b[ 0 ] = 0; |
ArrayTest.exe の 0x7c812a5b で初回の例外が発生しました: Microsoft C++ の例外: COleException (メモリの場所 0x0012f048)。
‘System.Runtime.InteropServices.SEHException’ の初回例外が ArrayTest.exe で発生しました。
‘System.Runtime.InteropServices.SEHException’ のハンドルされていない例外が ArrayTest.exe で発生しました。
COleExceptionという例外が発生するようだ。
stl vector
標準C++のライブラリSTLのvectorを使って実験。
1 2 |
vector < int > c; c[ 0 ] = 0; |
Microsoft Visual Studio C ランタイム ライブラリは ArrayTest.exe に致命的なエラーを検出しました。
これ以外は特にデバッグの出力ウィンドウには表示されなかった。
C++/CLI 配列
Visual C++のC++/CLI言語で単なる配列を使って実験。
1 2 |
int * d; d[ 0 ] = 0; |
‘System.NullReferenceException’ の初回例外が ArrayTest.exe で発生しました。
‘System.NullReferenceException’ のハンドルされていない例外が ArrayTest.exe で発生しました。
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。
このときウォッチでdの値を見ると<未定義の値>となる。ちなみに、次のようなコードを書いてもコンパイルは通り、実行もされる。特にエラーは発生しない。というのも逆アセンブルするとわかるがコンパイル時にここら辺のコードは省かれるようだ。
1 2 |
int d[ 1 ]; d[ 1 ] = 0; |
さらに、共通言語ランタイム サポート(/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を使って実験。
1 2 |
array < int > ^ f; f[ 0 ] = 0; |
‘System.NullReferenceException’ の初回例外が ArrayTest.exe で発生しました。
‘System.NullReferenceException’ のハンドルされていない例外が ArrayTest.exe で発生しました。
追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。
ちなみに割り当ててから範囲外を参照すると先ほどとは違うエラーになる。
1 2 |
array < int > ^ f = gcnew array < int > ( 1 ); f[ 1 ] = 0; |
‘System.IndexOutOfRangeException’ の初回例外が ArrayTest.exe で発生しました。
‘System.IndexOutOfRangeException’ のハンドルされていない例外が ArrayTest.exe で発生しました。
追加情報: インデックスが配列の境界外です。