这是一个简单的演示,只是循环malloc()
和free()
。
#include <cstdio>
#include <cstdlib>
#include <cmath>
int main(int argc, char **argv) {
int mallocTime = 100000;
for (int i=1; i<=mallocTime; i++) {
int size = (rand()%1024*1024*30);
char *a = (char*)malloc(size);
free(a);
}
int v; {
// Pause program.
scanf("%d", &v);
}
return 0;
}
我注意到,当mallocTime
变大时,我的记忆力会增加.
这是mallocTime = 0
时的内存状态
root 21416 0.0 0.0 6568 1712 pts/4 S+ 20:53 0:00 ./a.out
虽然这时mallocTime = 100000
root 21786 0.0 0.5 37328 22204 pts/3 S+ 20:55 0:00 ./a.out
如您所见,VSZ 和 RSS 都增长.
我想知道为什么,很明显我正确地释放了内存,为什么它仍然增长? 增长的内存字节数是多少?
大多数 glibc malloc 实现不会将内存返回到操作系统,除非:
- 您在
mallopt
中设置阈值。但根据我的经验,在向系统释放内存后,竞技场仍然由系统保留 - 调用将向系统释放内存的
malloc_trim
https://man7.org/linux/man-pages/man3/malloc_trim.3.html - 按系统调用
madvice
https://man7.org/linux/man-pages/man2/madvise.2.html
不要投射 malloc 的结果。如果您的编译器抱怨,则意味着您使用C++编译器编译 C 代码,这不是一个好主意。
试试这个:
int main(void) {
size_t mallocTime = 100000;
srand((unsigned)time(NULL));
while(mallocTime--)
{
int size = (rand()%1024*1024*30);
char *a = malloc(size);
free(a);
malloc_trim(0);
}
int v; {
// Pause program.
scanf("%d", &v);
}
return 0;
}