• 締切済み

C++の投げる例外について

VisualStdio2005でC++のプログラムを組んでいたところCtrl+F5で実行すると落ちてしまうバグを発見しました。 仕方ないのでF5で実行して場所を特定しようとしたのですがF5でデバッガを通すと動くのです。 そこでメッセージボックスでしらみつぶしに調べていった結果、ある特定の場所でnewしたところで落ちていることがわかりました。 しかしただのnewで、そのあとにしっかりとNULLチェックまでしているのですがNULLチェックに到達せずnewした瞬間落ちているようです。 デバッグウインドウには CTVTRegKeyOpenExceptionで例外が投げられましたと出ているのですがネットで検索しても1件しかヒットしません。 何か心あたりのある方はご教授願います。 WindowsXPPro メモリ2048MB CPU:Core2duo 2.33GHz VisualStdio2005

みんなの回答

回答No.3

> strcpy_s()をstrcpy()に直したところ正常に動きました…  _sなし版に変えて動くってことは、潜在的にバッファーオーバーランなどの バグを抱えてるってことでは?  _s付きでも動くような修正をした方がいいかと思いますよ。

noname#68570
noname#68570
回答No.2

newで例外が発生するのはメモリの割り当てに失敗したときか、 newするクラスのコンストラクタで落ちて例外が発生したかのどちらかだと思うんですけど、newの直前からF11でステップ実行して更に調べられないでしょうか?

0xEF
質問者

お礼

ありがとうございます。 すでに自己解決してしまって恐縮なのですが、F5で実行すると落ちないで通ってしまうのでF11のステップ実行はきかなかったのです^^; アドバイスありがとうございました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

ソースコードを見ないと何とも言えませんが... > しかしただのnewで、そのあとにしっかりとNULLチェックまでしているのですがNULLチェックに到達せずnewした瞬間落ちているようです。 newに失敗すると、NULLが返るのではなく、std::bad_alloc例外が送出されます。ですから、NULLチェックをしても無駄です。 new(std::nothrow)としていれば、operator newに失敗した場合にはNULLが返りますが、operator newに成功後、コンストラクタで失敗すると例外が送出されますので、やはりNULLチェックだけでは役に立ちません。

0xEF
質問者

お礼

ありがとうございます。 本当にすみませんが自己解決しました… 結局メッセージボックスで虱潰しに調べたんですがその1個上の命令 strcpy_s()で落ちていました。 strcpy_s()をstrcpy()に直したところ正常に動きました… セキュリティの高い関数を使うようにと怒られるので努めて使っていたのですがこんなところで引っかかるとは…

関連するQ&A