C++ VS2015 C++;静态初始化崩溃,可能存在错误
我看到Visual Studio 2015社区发生了一些奇怪的事情。在VS2012中运行良好的代码在启动时移植到VS2015时崩溃,然后调用main:一些静态初始化混乱的典型症状。我有一些静态变量,但使用得当,采用标准的“首次使用时构造”模式,例如: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只会退出程序:没有调用堆栈,没有任何信息 但是,下
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,否则程序无法启动
所以。。。我是错过了什么,还是真的搞砸了
更新:
我花了一些时间试图找到显示问题的最小设置,这就是我得到的:
有没有办法上传项目的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()代码>外主。没有区别。