先说结论:系统会先将全局对象的内存销毁,最后一次性抹掉堆上的内存。
如果全局对象被销毁(会调用其析构函数)后,还有线程正在访问该对象,那么会发生crash,这种情况经常出现在iOS上,其他平台可能比较难捕获吧。
解决方案目前有3种:
监听进程结束信号(通过注册onexit函数),同步等待线程结束,这样避免访问全局对象。
不要释放掉全局对象,也就是阻止全局对象调用析构函数,Apple平台(iOS/MacOS)可以在变量声明前加上
[[clang::no_destroy]]
,比如:[[clang::no_destroy]] MyClass obj;
,这样编译后的代码保证不会调用这个变量的析构函数。将全局对象改为由堆分配内存。
另外,在windows下,如果杀进程的时候去调用notify,会出现卡死的情况,因为线程被先释放了(这点目前只在Windows下出现,iOS/Mac/Android上不会出现这种问题)。