VS2015 c++静态初始化崩溃,可能有bug
VS2015 C++ static initialization crash, possible bug
我发现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实际上搞砸了?
更新:我花了一些时间试图找到显示问题的最小设置,下面是我得到的:
- 使用"CLR空项目"模板创建一个项目。
- 添加一个cpp文件,只包含有问题的函数和main()。Main可以是空的,没关系:bug甚至在到达它之前就发生了。
- 添加'main'作为入口点(否则你会得到一个链接错误)。
x86版本可以工作,但x64不行。
相比之下,即使添加了/CLR选项,具有相同代码但创建为"Win32控制台应用程序"的项目也没有问题。我可以看到vcxproj文件中的差异,但没有一个证明错误,尽管其中一个或多个显然是原因。
是否有办法上传一个zip与项目?
@bogdan说对了。我的项目混合了既不是/SUBSYSTEM:CONSOLE也不是/SUBSYSTEM:WINDOWS的设置。一旦我解决了这个问题,一切都开始像预期的那样工作。我的测试项目也有同样的问题,我责怪微软在VS2015中没有一个清晰的"CLR windows应用程序"c++模板(他们想要推动你使用c#,这在大多数时候是有意义的,但并不总是)。
我发现这个页面在解释所有必须保持一致的不同设置(不仅仅是/SUBSYSTEM…)时特别有用。
我希望我能把@bogdan的评论标记为答案,但是我看不出有什么可以这样做的。
谢谢Bogdan !
- 有没有可能有一个只有ADL才能找到的非好友功能
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- Winsock2 select():同一个套接字上可能有多个事件吗?
- 是否有可能有一个派生类继承最终函数但创建相同的函数(而不是重写)
- 打印所有可能有 4 个字母的单词的时间太多
- 使用 gcc 的 -fno-math-errno 可能有什么副作用?
- 长镜头 -- 可能有一个静态类成员,该类成员具有访问非静态成员的 lambda
- 画线不起作用,可能有什么问题?
- 嵌入式串行读取操作和桌面PC之间可能有什么区别
- 如何/是否有可能有一个载体<unique_ptr<ABC>>?
- 怎么可能有两个同名的变量——一个是全局变量,另一个是局部变量
- 是否有可能有一个程序将键盘输入更改为所有其他程序
- 是否有可能有一个指针指向由奇怪的递归模板创建的基类
- VS 2012 中可能有什么变化来破坏我的C++应用程序?
- LNK2005错误,已定义:可能有一个定义规则违反
- 是否可能/有必要在单独的线程[MFC]中调用OnDraw
- [[noreturn]]函数怎么可能有返回类型
- 一个正则类在c++中怎么可能有一个singleton子类
- std::sort有可能导致bug吗?
- VS2015 c++静态初始化崩溃,可能有bug