当前位置:首页 > c++ > 正文内容

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

xuwenyan2年前 (2021-04-12)c++1400

现象:

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

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

如何解决?

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

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


为什么这样能解决问题?

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

更为详细的解释可以参照微软的文档:/Zc:threadSafeInit(线程安全的本地静态初始化)

    文章作者:xuwenyan
    版权声明:本文为本站原创文章,转载请注明出处,非常感谢,如版权漏申明或您觉得任何有异议的地方欢迎与本站取得联系。

    扫描二维码推送至手机访问。

    版权声明:本文由艺文笔记发布,如需转载请注明出处。

    本文链接:https://www.xuwenyan.com/archives/1679

    分享给朋友:

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

    C++如何实现远程注入dll

    C++如何实现远程注入dll

    如何把我们的代码放到别人的进程里面运行?我们需要做一个dll动态库,然后使用远程注入技术,将我们的dll注入到别人的进程里面,然后加载起来。这样我们的代码就可以在别人的进程里面工作了。注入代码#include "stdafx.h" int EnableD...

    C++如何获取控制台程序的输出内容?

    C++如何获取控制台程序的输出内容?

    很多工具程序(如ffmpeg)的进度显示往往都是以控制台字符显示的方法,我们可能需要调用这种控制台工具去完成工作,但同时又希望以友好的ui界面去显示当前的工作状态(如进度)。此时我们能想到的就是运行控制台程序,然后以某种方式去获取到控制台程序的输出,然后转换到我们的ui界面上去显示。 有多种...

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    例如,我用VC2015的工程向导新建一个ATL的工程名字叫myAtl,那么VC会同时给我生成一个叫做myAtlPS的工程。这个myAtlPS工程是做什么的?什么情况下可以不需要它?什么情况下它又是必须存在的? PS工程是什么?可以不要吗? 这个PS工程叫做代理与存根(proxy&nbs...

    uafxcwd.lib(afxmem.obj) : error LNK2005:

    uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)"解决办法

    如果在编译MFC程序的时候出现下列及类似的错误: 1˃uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMTD.lib(new...

    C++ 获取进程所在目录(进程全路径)

    C++ 获取进程所在目录(进程全路径)

    打开windows任务管理器,会看到很多的进程在运行,随机挑选一个,如何通过c++代码获取某一个进程的所在全路径呢?这也是在windows软件开发中经常遇到的需求。通过进程名获取进程全路径由于可能很多进程叫同一个名字,所以获得的结果也有可能是多个#include <windows.h...