c++ - VS2015 C++静态初始化崩溃,可能是bug

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

我看到 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 版本无效。

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

有没有办法上传项目的 zip 文件?

最佳答案

好吧,@bogdan 做对了。我的项目混合了既不是/SUBSYSTEM:CONSOLE 也不是/SUBSYSTEM:WINDOWS 的设置。一旦我解决了这个问题,一切都开始按预期工作。我的测试项目有同样的问题,我责怪微软在 VS2015 中不再有一个清晰的“CLR windows app”C++ 模板(他们想插入你为此使用 C#,这在大多数时候都是有意义的,但并非总是如此).

我找到了 this page在解释所有必须保持一致的不同设置时特别有用(不仅仅是/SUBSYSTEM...)。

我希望我可以将@bogdan 的评论标记为答案,但我看不到这样做的任何方法。

谢谢博格丹!

关于c++ - VS2015 C++静态初始化崩溃,可能是bug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32079095/

相关文章:

c++ - C++ 字符串文字的类型

c++ - 如何将 Algol 68 Genia 语言转换为 C++ 语言

C++14 类型列表,有什么理由更喜欢 'free functions' 到 'methods',反之亦然?

visual-studio-2015 - 未在 Visual Studio 2015 中生成的 pdb 文件

roslyn - 引用问题/缺失类型

c++ - 基于航拍图像的地面机器人障碍物检测

c++ - 在自动化测试后安全清理阻塞的 std::thread

c++ - 使用 Howard Hinnant 的 short_alloc 进行快速 move 分配

c++ - 如何对可变参数函数中的所有参数调用 std::forward ?

c# - 使用 System.Data.SQLite 和 Entity Framework 6 的简单示例