解决程序在xp系统总是莫名奇妙的崩溃问题(/Zc:threadSafeInit- )

现象:

程序在xp系统上面总是莫名其妙的崩溃,检查代码看不出任何问题,感觉代码都很好。即使你远程调试,找到了崩溃的点,当你注释了崩溃点之后,还是会崩溃到别的地方。

当你遇到了这种情况的时候,不妨参照一下下面的方法看看,说不定可以解决问题。

如何解决?

将崩溃程序相关的所有工程代码全部关闭全局变量的线程安全检测(TLS),注意!!!是全部工程,比如a.exe崩溃,那么将a工程相关的所有工程全局关闭全局变量的线程安全检测,包括静态库。

如何关闭全局变量的线程安全检测?打开vs工程属性页:属性 -> C / C ++ – >命令行 – >添加“/Zc:threadSafeInit- ” 

为什么这样能解决问题?

编译器默认是以线程安全(TLS)去初始化全局变量的,也就是’/Zc:threadSafeInit’(以tls方式加载会有效率上的优化),但是tls又需要windows vista及更高的系统支持。早期系统不支持tls,所以使用tls并没有什么效率上的优化,更糟糕早期系统对tls节的加载数量限制很低,超过tls限制部分就可能导致崩溃。因此’/Zc:threadSafeInit-‘能解决这样的问题。

更为详细的解释可以参照微软的文档:https://docs.microsoft.com/en-us/cpp/build/reference/zc-threadsafeinit-thread-safe-local-static-initialization?view=msvc-160


本文为@艺文笔记原创文章,转载请注明出处:https://www.xuwenyan.com/archives/1679,非常感谢!
上一篇:  下一篇: