2012-12-19 64 views
0

我在客戶的計算機上有一個非常奇怪的'崩潰'。使用日誌我能夠跟蹤它到這行代碼:構造函數中的fp賦值崩潰[C++]

myvar = 1; //這個'崩潰'。 myvar被宣佈爲'雙'

代碼顯然是好的。但myvar是一個類的成員變量。這個變量有一個全局實例,代碼行在構造函數中。所以它在main()之前執行。不好的風格,我知道...

我的問題: - 是否允許在main()之前使用float/double? - 是否有某種我可以調用的「InitFloatSystem()」函數?

一些更多的信息: - 這是一個Win32/C++ - 有沒有崩潰的消息,該方案只是關閉 - try/catch語句並不能幫助

我真的沒了主意......

+0

您描述的內容沒有問題。它以什麼方式「崩潰」? –

+0

「這是一個Win32」 - 哦Windows?這就解釋了很多。 – 2012-12-19 16:52:41

+1

你可以展示一些更多的代碼來給出一些上下文,特別是變量聲明等。也許一個[SSCCE](http://sscce.org/)。另外,你有沒有在調試器中運行程序? –

回答

1

最後終於找到了問題。這是Visual Studio 2012的一個問題。我在微軟網站上發現,儘管他們報告了不同的副作用:http://connect.microsoft.com/VisualStudio/feedback/details/771122/floating-point-math-change-from-vs2008-to-vs2012-affects-native-code-but-not-managed-code

我的猜測是,編譯器現在默認使用某些舊處理器上不可用的處理器功能。使用這個編譯器選項可以神奇地修復它: /arch:IA32

+0

我想這是你的問題,然後http://en.wikipedia.org/wiki/SSE2#Notable_IA-32_CPUs_not_supporting_SSE2古董CPU沒有SSE2指令集支持 - 你的例外應該是「非法指令」。 – paulm

0

除非你的二進制文件被破壞了,否則簡單的賦值就不會導致崩潰 - 除非你重載了賦值運算符?

更可能的是,你已經損壞了堆,或者調用了未定義的行爲,一些地方和你追蹤到的東西只是一個副作用。

應用程序驗證程序是非常方便的Windows幫助追查這些事情:

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

但..其絕非簡單的追查這些各種各樣的bug的真正原因,最高警告級別,作爲錯誤的警告和靜態代碼檢查程序有助於將這些問題的大部分保留在其中。

+0

不是我所希望的銀彈;-)。但我認爲你是對的,所以我會把這個作爲我的問題的答案。 – user178379

+0

我會確保你仍然擁有/ GS:http://msdn.microsoft.com/en-US/library/8dbf701c(v=vs.80).aspx *應該*選擇任何基於堆棧的緩衝區溢出。 – paulm

+0

現在我很確定它不是一個野生指針。如果我將此作業移至其他功能,也會發生崩潰。即使它發生在主函數中的構造函數之後。即使浮點變量是局部變量也會發生。我仍然沒有弄明白,但如果我做過,我會在這裏發佈。 – user178379