1

したがって、Visual Studio 2010 で記述およびコンパイルされた、次のようなコードがいくつかあります。

if ( outputFile.is_open() )
{
    outputFile.close();
}
if ( !outputFile.is_open() ) // condition for sanity-checking
{
    outputFile.open("errorOut.txt", ios::out);
}

これは、アクセス違反でクラッシュします。デバッガーをアタッチすると、最初の条件が false (outputFile開いていない)、2 番目の条件が true (outputFile閉じている、チェックしたばかりなので問題ありません) であることがわかります。その後open()、呼び出され、最終的にlocale::getloc()null ポインターを逆参照しようとしますが、なぜそれが起こるのかわかりません (標準ライブラリの奥深くに 3 つのクラスがあるため)。

興味深いことに、呼び出しがクラッシュしても、ファイル "errorOut.txt"は作成されます。open

デバッガーでこれを数時間監視しましたが、正直なところ、何が起こっているのかわかりません。コードの何が問題なのかを判断しようとするアイデアはありますか? 他の場所のコードがこの状況 (継承されたコード) に寄与している可能性は十分にありますが、それはたくさんあり、どこを見ればよいかさえわかりません。その時点まではすべて問題ないようです。

4

1 に答える 1

1

OK、これがこれを処理する最善の方法かどうかはよくわかりませんが、これには本当に奇妙な動作 (STL 関数の途中でのクラッシュ、ハングアップなどの他の奇妙な動作) が含まれていたのでexit(1);、私は'将来のためにここに説明を残します。

私たちの場合、エラーは、継承した本当にひどいコードで起こっているメモリ破損に由来するように見えました. 一般的にコードをクリーンアップすると、このクラッシュや、プログラムによって表示されるその他の奇妙な動作が解消されました。

これが誰にとっても役立つかどうかはわかりません。単純に質問を削除したほうがよかったかもしれません。誰かがコメントを残したい場合、私は持っているべきかどうか、私は実際にはやや興味があります.

于 2012-07-24T21:57:56.063 に答える