繁体   English   中英

VS2015 C ++静态初始化崩溃,可能是错误

[英]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真的搞砸了吗?

更新:

我花了一些时间试图找到显示问题的最小设置,这就是我得到的:

  1. 使用“ CLR空项目”模板创建一个项目。
  2. 添加一个cpp文件,其中仅包含有问题的函数和main()。 Main可以为空,没关系:该错误在到达之前就已发生。
  3. 添加“ main”作为入口点(否则会出现链接错误)。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM