静态智能指针变量调用DLL引发的一个CRASH给的启示

一般遇到崩溃,都是先看看堆栈



然后双击相应的堆栈跳转到源码,



然后发现居然是析构出问题了,这个问题大了,不太好找,一般情况下,无非就是类里面某个地方指针越界,或者重复析构,按照这个思路,翻遍整个代码,发现并没有问题,那么问题是什么呢?后来想,反正程序都要退出了,就强制让这个类析构了,于是我们加了一句代码;

m_ptrSubPubMgr = nullPtr;  

这回应该可以安全退出吧?谁知还是不行,这次异常就停止在m_ptrSubPubMgr = nullPtr;  这个位置,唯一的解释就是m_subPubMgr所在的空间已经被回收了。。于是再次分析代码, 发现真的回收了,如下图,因为DLL已经被释放掉了,回顾m_ptrSubPubMgr的定义为   static std::shared_ptr<SubPubMgr> m_ptrSubPubMgr = nullptr; ;终于发现问题所在


因为m_ptrSubPubMgr有调用了hiredis.dll, 里面的资源已经先于m_ptrSubPubMgr释放了,而语句m_ptrSubPubMgr = nullPtr又会让智能指针去释放一些东西,于是问题就出来了。


总结:记住一个原则,DLL资源的释放有可能先于静态变量释放,所以静态变量不要去调用DLL中的资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值