[英]VS2015 C++ static initialization crash, possible bug
我看到Visual Studio 2015社区发生了一些奇怪的事情。 在调用main之前,移植到VS2015时,在VS2012中完美工作的代码在启动时会崩溃:一些静态初始化混乱的经典症状。 我有一些静态变量,但使用正确的标准标准“首次使用时构造”模式,例如:
const int& i()
{
static int *v = new int(1);
return *v;
}
上面的代码在初始化程序时导致运行时断言(请参见图像http://i.stack.imgur.com/nsQGS.png )。 按重试只是退出程序:没有调用堆栈,没有任何信息。
但是,以下代码可以完美地工作:
const int& i()
{
static int *v = nullptr;
if (v == nullptr)
v = new int(1);
return *v;
}
在我看来,VS2015通过在程序初始化期间(而不是作为C ++标准首次调用该函数)执行静态变量初始化代码来进行某种(非法)优化(即使在调试版本中)需要。 我尝试了上面代码的几种变体:类方法,自由函数,不同的对象(std :: vector,cv :: Mat),总是得到相同的结果:静态指针必须初始化为null或程序不需要开始。
所以...我错过了什么还是VS2015真的搞砸了吗?
更新:
我花了一些时间试图找到显示问题的最小设置,这就是我得到的:
x86版本有效,但x64版本无效。
为了进行比较,即使添加/ CLR选项,具有相同代码但创建为“ Win32控制台应用程序”的项目也没有问题。 我可以看到vcxproj文件中的差异,但是没有一个可以证明错误,尽管其中一个或多个显然是原因。
有没有办法上传项目的zip文件?
好吧,@ bogdan正确了。 我的项目混合了既不是/ SUBSYSTEM:CONSOLE也不是/ SUBSYSTEM:WINDOWS的设置。 一旦我解决了这个问题,一切就会开始按预期进行。 我的测试项目也遇到了同样的问题,我怪微软在VS2015中没有清晰的“ CLR Windows应用” C ++模板(他们想让您为此使用C#,这在大多数情况下是有意义的,但并非总是如此) )。
我发现此页面在解释必须一致的所有不同设置时特别有用(不仅仅是/ SUBSYSTEM ...)。
我希望我可以将@bogdan的评论标记为答案,但是我看不到有什么可以做的。
谢谢波格丹!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.