- ベストアンサー
C++例外の回避方法
- VS2005でtest.exeからtest.dll(VC++)を呼び出すプログラムを作成しています。
- デバッグの際に、0x7c812a5bでMicrosoft C++の例外が発生しました。メモリのアクセスのエラーでしょうか?
- readrecordTempの長さが2未満の場合に問題が発生し、回避方法について知りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>readrecordTempの最後の二つの符号を取りたい >改行コードが入ることです。 fgetsなどのC言語のファイルストリーム関数では 「改行コードは、LFのみの1バイト」 です。 扱っているファイル内の改行コードが「CR+LF」の2バイトであっても、C言語のファイルストリーム関数は、内部で「LFのみ」に変換します(但し、ファイルをバイナリモードで開いている場合を除く) なので 「改行が2バイトだと思いこんでいる限り、思った通りには動かない」 でしょう。 質問者さんのプログラムでは「改行のみの行」をfgetsした場合、readrecordTempの中身は「"\n"+EOS」になり、strlen(readrecordTemp)は「1」になります。 質問者さんは「改行のみの行を読んだら、readrecordTempの中身は"\r\n"+EOSになり、strlen(readrecordTemp)は2になる。1になる事は無い」と勘違いしていますから returncode1 =readrecordTemp[strlen(readrecordTemp) -2 ]; の行で例外が起きる筈はない、と思い込んでいます。 しかし、readrecordTempは「"\n"+EOS」や「""+EOS」になる事があり、strlen(readrecordTemp)は1や0など、2未満になる可能性があります。 strlen(readrecordTemp)が1や0になれば returncode1 =readrecordTemp[strlen(readrecordTemp) -2 ]; や returncode2 =readrecordTemp[strlen(readrecordTemp) -1 ]; の行で readrecordTemp[ -2 ] や readrecordTemp[ -1 ] に対してアクセスするので、例外が発生して当然です。 まずは「改行コードは1バイトである」と「fgetsしたら、読み込んだ文字列の文字列長が0や1になる事がある」と言う事を理解しましょう。 これが理解出来て居ないので、同じような質問を何度も繰り返し、そのたびに明確な回答が得られず、再質問の繰り返しになるのです。
その他の回答 (2)
- asuncion
- ベストアンサー率33% (2127/6290)
>readrecordTempの最後の二つの符号を取りたい 最後の二つの符号、の意味がわかりません。
- D-Matsu
- ベストアンサー率45% (1080/2394)
> 実際にどういう問題でしょうか? readrecordTemp[]で確保していないメモリ領域へのアクセスが発生します。 2未満の方は言うまでもありませんが、VT_MAX_READ_SIZEがREAD_SIZEより大きい場合にも問題が出る可能性がありますね。 #というかこの二つは同じ定数使った方がいいんでは? > どうやって回避できるでしょうか? strlen(readrecordTemp)の値を見て、異常が出る値(2未満とかREAD_SIZE+1以上とか)ならエラー処理をすればよいのでは。 どんなエラー処理が必要なのかはこれだけではなんとも言いようがないのでご自身で考えてください。
補足
改行コードが入ることです。