为什么 malloc后必须 free?不 free 到底会怎样? 📅 2026/7/8 1:48:45 为什么 malloc 后必须 free不 free 到底会怎样大三写过一个网络爬虫跑了大概 40 分钟Windows 弹出个框“内存不足请关闭程序”。我当时觉得不可思议——一个爬虫又不是游戏能吃多少内存翻代码翻了二十分钟找到一行char*bufmalloc(4096);在整个请求循环里每次进来都 malloc 一个 4KB 的 buffer但从来没 free 过。一个请求 4KB跑了十几万个请求四百多兆内存就这么没了。这不是 bug是没写 free。malloc 和 free 的关系说白了就是借和还。你找操作系统借一块内存——malloc(100)——操作系统从堆上划 100 个字节给你返回一个地址。你用完了应该通过free(ptr)把这块内存还给操作系统。char*pmalloc(100);// 借strcpy(p,hello);free(p);// 还如果你只借不还——每次进函数都 malloc出来不 free——那块借走的内存就一直标记为占用。操作系统以为你还在用不会分配给别的程序。你的进程占着它别的进程用不了它。时间一长内存就这么一寸一寸被吃光。这就是内存泄漏。但很多人有个误区觉得程序退出的时候操作系统会自动回收所有内存所以不 free 也没事。写一个命令行工具、写一个练手的 demo确实没事。程序跑几秒就结束了操作系统二话不说把整片地址空间收回去泄漏也好没泄漏也好反正全清了。问题出现在那些不会退出的程序上。服务器、数据库、浏览器、游戏引擎——这些东西一跑就是几个月甚至几年不重启。如果处理每个请求都泄漏哪怕 100 字节一天一百万请求就是一百兆泄漏。一个礼拜就能把服务器内存吃干。更隐蔽的是泄漏不一定来自你忘了 free。有一种情况叫指针丢了char*pmalloc(100);pmalloc(200);// p 指向了新内存原来的 100 字节永远找不到了那块 100 字节还在堆上但没有任何指针指向它。你 free 不了它操作系统也不会在你进程活着的时候收回它。它就在那里占着位置像个没人记得密码的保险箱。不 free 不是一定不行——有时候程序员故意不 free。有些程序在退出前调用exit()让操作系统一把清空所有资源。这种写法在特定场景下是合理的——比如写一个短生命周期的工具退出前逐块 free 几百个 malloc 出来的小块内存耗时可能比直接 exit 还长。但这是一种明知后果的选择不是忘了写 free 好像也没事。如果你不确定这个程序以后会不会变成一个长期运行的服务如果你不确定这个函数以后会不会被循环调用几千次——老老实实写 free。借了就要还不然利息是拿内存付的。你有没有排查过内存泄漏花了多久才发现那块没 free 的内存来评论区聊聊。#c语言 #算法 #数据结构