0

顧客のコンピュータでかなり奇妙な「クラッシュ」が発生しました。ログを使用して、次のコード行まで追跡できました。

myvar = 1; //これは「クラッシュ」します。myvar は「double」として宣言されています

コードは明らかに問題ありません。しかし、myvar はクラスのメンバー変数です。そして、この変数のグローバル インスタンスがあり、コード行はコンストラクターにあります。したがって、main() の前に実行されます。スタイルが悪いのは承知の上で…

私の質問: - main() の前に float/double を使用できますか? - 呼び出すことができる「InitFloatSystem()」関数はありますか?

詳細情報: - これは Win32 / C++ です - クラッシュ メッセージは表示されず、プログラムは終了するだけです - try/catch は役に立ちません

私は本当にアイデアがありません...

4

2 に答える 2

1

ついに、ついに問題が見つかりました。これは Visual Studio 2012 の問題です。マイクロソフトの Web サイトで見つけましたが、さまざまな副作用が報告されていました。-vs2008-to-vs2012-affects-native-code-but-not-managed-code

私の推測では、コンパイラは現在、一部の古いプロセッサでは利用できないプロセッサ機能をデフォルトで使用しています。このコンパイラ オプションを使用すると、魔法のように修正されました: /arch:IA32

于 2013-01-10T09:12:36.400 に答える
0

バイナリが破損していない限り、代入演算子をオーバーロードしていない限り、単純な代入でクラッシュが発生することはありません。

可能性が高いのは、ヒープを破損したか、どこかで未定義の動作を呼び出した可能性があり、追跡したことはこれの単なる副作用です。

Application Verifier は、Windows で次のようなことを追跡するのに非常に便利です。

http://msdn.microsoft.com/en-us/library/ms220948(v=vs.90).aspx

しかし.. この種のバグの本当の原因、最高の警告レベル、エラーとしての警告、および静的コード チェッカーを追跡することは、これらの問題の大部分を寄せ付けないようにするのに役立ちます。

于 2012-12-19T19:09:35.333 に答える