不停的malloc程序会异常吗

描述

把 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 函数,运行程序,应该是个怎样的现象?如果你能看出来,欢迎在评论区交流。
 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分