一般遇到崩溃,都是先看看堆栈
然后双击相应的堆栈跳转到源码,
然后发现居然是析构出问题了,这个问题大了,不太好找,一般情况下,无非就是类里面某个地方指针越界,或者重复析构,按照这个思路,翻遍整个代码,发现并没有问题,那么问题是什么呢?后来想,反正程序都要退出了,就强制让这个类析构了,于是我们加了一句代码;
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中的资源