把 malloc 放在死循环里面,会是什么样的现象?
比如这样的代码,每次使用 malloc 申请 1M 大小的内存,其他什么操作也不做。
理论上来说,堆内存是有限的,如果不停的申请,迟早内存会被用完,程序应该会异常退出。
于是我找了个环境,把程序运行起来试下。
先用虚拟机,跑的一个 32 位的红帽系统,程序运行起来,好像只是一个普通的死循环,半天也没见他退出,而且程序也不卡顿。
看下进程的内存使用情况,数值一直都没变。
应该可以得出结论,虽然不停的申请,但是因为内存没有使用,所以系统并没有真正的分配。
修改下代码,申请了内存后,使用 memset 把内存初始化一下,再次运行,不一会虚拟机卡顿,直到程序被杀死。
换个环境,这次使用 64 位的Ubuntu,同样的代码,没有初始化内存,运行程序,很快进程就被杀死。
运行的时候看了下内存的使用情况,确实是在快速的增长。
所以在这个环境里面,即使申请的堆内存没有使用,系统也确实给分配了。
同样是 malloc 函数,不同的操作系统,内存管理的策略也不太一样。
#include#include int main() { char *p = NULL; while (1) { p = (char *)malloc(1); *p = 1; } return 0; }
最后给大家看个笔试题,也是关于 malloc 函数,运行程序,应该是个怎样的现象?如果你能看出来,欢迎在评论区交流。
全部0条评论
快来发表一下你的评论吧 !