起因
下面这段代码执行后,内存有增无减,增加了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 了。