free()后内存不释放问题 - 内存缓冲池技术(转)

本文探讨了C/C++中内存管理的问题,特别是free()后内存不释放的原因,如在iOS平台上。介绍了内存缓冲池的概念和原理,包括Linux和iOS平台的内存管理差异。文章提到了Glibc的内存管理问题和如何通过malloc_zone_t在iOS上自定义内存缓冲区以解决内存释放问题,同时讨论了内存碎片和时间空间权衡。最后,概述了ptmalloc的内存分配和回收机制,以及其在多线程和大内存分配中的局限性。
摘要由CSDN通过智能技术生成

起因

下面这段代码执行后,内存有增无减,增加了200M,iOS平台200M不能接受了

// STL 集合类
void test1() { list<int> mList; for (int i=0; i<1000000; i++) { mList.push_back(i); } mList.clear(); } // mList 作用域 {} 内,stack 上的变量由编译器出了 } 自动释放 

STL 底层是用 new/delete 分配内存的,new/delete 是基于 malloc/free 分配的,malloc/free 又是基于各个操作系统统一封装,于是我写了下面的测试代码

// 申请 100w 个 100byte 的空间,再释放掉
void test2() { char **ptr = (char **)malloc(1000000 * sizeof(char *)); for (int i=0; i<1000000; i++) { *(ptr + i) = (char *)malloc(100 * sizeof(char)); } for (int i=0; i<1000000; i++) { free(*(ptr + i)); } free(ptr); } 

内存依然去到了300M,无减少。 原因:

  • Windows 平台调用free,内存会马上降回来。
  • Linux 平台调用free,内存不会释放回OS,而是释放回系统的内存缓冲池,进程退出时才释放回OS。(ps:Linux下谷歌有个 tcmalloc 能做到立刻释放到OS,或者malloc_trim(0))
  • iOS 平台调用 free 后,也只是释放到系统的内存缓冲池里,进程退出才释放回OS。

这就很麻烦了,iOS平台不能去到太高的内存,不然进程会被kiil的,必须要手动释放。
查了一下,iOS用不了谷歌的tcmalloc,malloc_trim也用不了,只能用 malloc_zone_t 自定义一个缓存区,用完自己销毁,就能够释放内存。如下面这段代码,就能把内存释放会 OS 了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值