杀进程后内存释放顺序导致的问题

原文 标签 IT工具网 编程

先说结论:系统会先将全局对象的内存销毁,最后一次性抹掉堆上的内存。

如果全局对象被销毁(会调用其析构函数)后,还有线程正在访问该对象,那么会发生crash,这种情况经常出现在iOS上,其他平台可能比较难捕获吧。

解决方案目前有3种:

  1. 监听进程结束信号(通过注册onexit函数),同步等待线程结束,这样避免访问全局对象。

  2. 不要释放掉全局对象,也就是阻止全局对象调用析构函数,Apple平台(iOS/MacOS)可以在变量声明前加上[[clang::no_destroy]],比如:[[clang::no_destroy]] MyClass obj;,这样编译后的代码保证不会调用这个变量的析构函数。

  3. 将全局对象改为由堆分配内存。

另外,在windows下,如果杀进程的时候去调用notify,会出现卡死的情况,因为线程被先释放了(这点目前只在Windows下出现,iOS/Mac/Android上不会出现这种问题)。

相关文章:

如何定义一个JavaScript函数?

为什么自我组织是直观的,但又具有挑战性

Android中"UserManger.isUserAGoat()"的合适案例

JavaScript代码结构的最佳实践BP

json数据中可以写注释吗?

数据结构有哪些,常用数据结构详解