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

时间:2015-08-18 17:37:09

标签: c++ c++11 visual-studio-2015

我看到Visual Studio 2015社区发生了一些奇怪的事情。完全在VS2012中运行的代码在启动时在启动时崩溃,在调用main之前:一些静态初始化混乱的典型症状。我有一些静态变量,但使用标准的“首次使用时构造”模式,例如:

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可以是空的,没关系:bug甚至在它到达之前就已经发生了。
  3. 添加'main'作为入口点(或者您收到链接错误)。
  4. x86版本有效,但x64没有。

    为了进行比较,即使添加了/ CLR选项,具有相同代码但创建为“Win32控制台应用程序”的项目也没有问题。我可以看到vcxproj文件中的差异,但没有一个证明错误,尽管其中一个或多个显然是原因。

    有没有办法上传项目的拉链?

1 个答案:

答案 0 :(得分:0)

好吧,@ bogdan做对了。我的项目混合了既不是/ SUBSYSTEM:CONSOLE也不是/ SUBSYSTEM:WINDOWS。一旦我解决了这个问题,一切都开始按预期工作了。我的测试项目有同样的问题,我责怪微软没有一个明确的" CLR windows应用程序" VS2015中的C ++模板(他们希望推动你使用C#,这在大多数情况下是有意义的,但并非总是如此)。

我发现this page在解释所有必须保持一致的不同设置时非常有用(它不仅仅是/ SUBSYSTEM ...)。

我希望我能将@ bogdan的评论标记为答案,但我无法做到这一点。

感谢波格丹!