为什么 malloc后必须 free?不 free 到底会怎样?

发布时间:2026/10/17 2:58:11
为什么 malloc后必须 free?不 free 到底会怎样? 为什么 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语言 #算法 #数据结构

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询