Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VS2015 C++;静态初始化崩溃,可能存在错误_C++_C++11_Visual Studio 2015 - Fatal编程技术网

C++ VS2015 C++;静态初始化崩溃,可能存在错误

C++ VS2015 C++;静态初始化崩溃,可能存在错误,c++,c++11,visual-studio-2015,C++,C++11,Visual Studio 2015,我看到Visual Studio 2015社区发生了一些奇怪的事情。在VS2012中运行良好的代码在启动时移植到VS2015时崩溃,然后调用main:一些静态初始化混乱的典型症状。我有一些静态变量,但使用得当,采用标准的“首次使用时构造”模式,例如: const int& i() { static int *v = new int(1); return *v; } 上面的代码在初始化程序时从运行时引发断言(参见图)。按retry只会退出程序:没有调用堆栈,没有任何信息 但是,下

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

const int& i()
{
  static int *v = new int(1);
  return *v;
}
上面的代码在初始化程序时从运行时引发断言(参见图)。按retry只会退出程序:没有调用堆栈,没有任何信息

但是,下面的代码可以完美地工作:

const int& i()
{
  static int *v = nullptr;
  if (v == nullptr)
    v = new int(1);
  return *v;
}
在我看来,VS2015在执行程序初始化时,通过执行静态变量初始化代码来执行某些(非法)优化(甚至在调试构建中),而不是C++调用标准所要求的第一次调用函数。 我尝试了上面代码的几种变体:类方法、自由函数、不同的对象(std::vector、cv::Mat),结果总是一样的:静态指针必须初始化为null,否则程序无法启动

所以。。。我是错过了什么,还是真的搞砸了

更新:

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

  • 使用“CLR empty project”模板创建项目
  • 添加一个cpp文件,其中只包含有问题的函数和main()。Main可以是空的,这无关紧要:bug甚至在到达它之前就出现了
  • 添加“main”作为入口点(否则会出现链接错误)
  • x86版本可以工作,但x64不能

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


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

    嗯,@bogdan做对了。我的项目混合了既不是/SUBSYSTEM:CONSOLE也不是/SUBSYSTEM:WINDOWS的设置。一旦我解决了这个问题,一切都开始按预期工作。我的测试项目也有同样的问题,我把微软归咎于没有一个清晰的“CLR Windows应用程序”C++模板在VS2015中(他们想推你使用C,这是有意义的大部分时间,但不是总是)。p> 我发现在解释所有必须一致的不同设置时特别有用(不仅仅是/子系统…)

    我希望我能把@bogdan的评论作为答案,但我看不出有什么办法


    谢谢博格丹

    为什么需要初始化堆上的对象?使用简单的
    int main(){int v=i();}
    ,它会崩溃吗?您是在发布模式下运行还是在调试模式下运行?不管有没有优化?在这里都很好。测试用例
    intmain(){intx=i();return x;}
    带有第一个版本的
    i()
    。添加了
    inty=i()外主。没有区别。