Android NDK:分配内存后程序崩溃 对应内存是否会自动释放?
解答
首先给出明确结论:调用abort()导致程序崩溃的场景下,你代码中的ptr不会自动释放所持有的堆内存,具体原因和补充说明如下:
- C++标准中,栈上局部对象的析构函数仅在正常栈展开流程中会被触发:包括函数正常执行完毕返回、抛出异常后触发的栈回溯过程,这两种场景下才会依次调用当前作用域内所有栈对象的析构函数,
std::unique_ptr的自动内存释放逻辑就是依赖自身析构函数实现的。 abort()是C/C++标准库定义的强制终止程序函数,它的设计目标是直接中断程序执行,不会触发任何栈展开逻辑,包括ptr在内的所有栈对象的析构函数都不会执行,因此它管理的内存自然不会被主动释放。
补充说明:上述的“不会释放”仅指进程运行期间不会被C++ runtime主动释放,如果
abort()触发后进程直接退出,操作系统会回收该进程占用的所有内存资源(包括这部分未主动释放的堆内存),不会造成系统级的内存泄漏,只会在进程长期运行的崩溃场景下出现内存泄漏问题。
另外你当前代码存在一处隐患:用std::unique_ptr<int>管理动态数组时,默认析构器会调用delete而非delete[],就算程序正常执行也会触发未定义行为,管理数组应该使用偏特化版本:std::unique_ptr<int[]> ptr(new int[1000])。
内容的提问来源于stack exchange,提问作者Kim Ninh
相关产品推荐
相关产品推荐

