VS2015 c++静态初始化崩溃,可能有bug

VS2015 C++ static initialization crash, possible bug

本文关键字:可能有 bug 崩溃 初始化 c++ 静态 VS2015      更新时间:2023-10-16

我发现Visual Studio 2015社区发生了一些奇怪的事情。在VS2012中运行良好的代码在移植到VS2015时在启动时崩溃,在调用main之前:一些静态初始化混乱的经典症状。我有一些静态变量,但使用得当,使用标准的"首次使用时构建"模式,例如:

const int& i()
{
  static int *v = new int(1);
  return *v;
}

上面的代码在初始化程序时从运行时引起一个断言(参见图片https://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),总是有相同的结果:静态指针必须初始化为空或程序不启动。

所以…是我错过了什么,还是VS2015实际上搞砸了?

更新:

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

  1. 使用"CLR空项目"模板创建一个项目。
  2. 添加一个cpp文件,只包含有问题的函数和main()。Main可以是空的,没关系:bug甚至在到达它之前就发生了。
  3. 添加'main'作为入口点(否则你会得到一个链接错误)。

x86版本可以工作,但x64不行。

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

是否有办法上传一个zip与项目?

@bogdan说对了。我的项目混合了既不是/SUBSYSTEM:CONSOLE也不是/SUBSYSTEM:WINDOWS的设置。一旦我解决了这个问题,一切都开始像预期的那样工作。我的测试项目也有同样的问题,我责怪微软在VS2015中没有一个清晰的"CLR windows应用程序"c++模板(他们想要推动你使用c#,这在大多数时候是有意义的,但并不总是)。

我发现这个页面在解释所有必须保持一致的不同设置(不仅仅是/SUBSYSTEM…)时特别有用。

我希望我能把@bogdan的评论标记为答案,但是我看不出有什么可以这样做的。

谢谢Bogdan !