2012-12-19 29 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