C语言,为什么动态内存分配申请后,还要再释放?
比如main函数里有一句 malloc(),
后面没有free()
1.那么当main结束后,动态分配的内存不会随之释放么?
2.如果程序结束能自动释放,那么还加上free(),是出于什么考虑?
1. 就算没有free(),main()结束后也是会自动释放malloc()的内存的,这里监控者是操作系统,设计严谨的操作系统会登记每一块给每一个应用程序分配的内存,这使得它能够在应用程序本身失控的情况下仍然做到有效地回收内存。你可以试一下在TaskManager里强行结束你的程序,这样显然是没有执行程序自身的free()操作的,但内存并没有发生泄漏。
2. free()的用处在于实时回收内存。如果你的程序很简单,那么你不写free()也没关系,在你的程序结束之前你不会用掉很多内存,不会降低系统性能;而你的程序结束之后,操作系统会替你完成这个工作。但你开始开发大型程序之后就会发现,不写free()的后果是很严重的。很可能你在程序中要重复10k次分配10M的内存,如果每次使用完内存后都用free()释放,你的程序只需要占用10M内存就能运行;但如果你不用free(),那么你的程序结束之前就会吃掉100G的内存。这其中当然包括绝大部分的虚拟内存,而由于虚拟内存的操作是要读写磁盘,因此极大地影响系统的性能。你的系统很可能因此而崩溃。
3. 任何时候都为每一个malloc()写一个对应的free()是一个良好的编程习惯。这不但体现在处理大程序时的必要性上,更体现在程序的优良的风格和健壮性上。毕竟只有你自己的程序知道你为哪些操作分配了哪些内存以及什么时候不再需要这些内存。因此,这些内存当然最好由你自己的程序来回收。
C语言,为什么动态内存分配申请后,还要再释放?相关推荐
- C语言中动态内存分配的本质是什么?
摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...
- 【C语言】动态内存分配
[C语言]动态内存分配 文章目录 [C语言]动态内存分配 一.malloc 与free函数 二.calloc 三.realloc 四.常见的动态内存的错误 本期,我们将讲解malloc.calloc. ...
- c语言malloc引用类型作参数,c语言中动态内存分配malloc只在堆中分配一片内存.doc...
c语言中动态内存分配malloc只在堆中分配一片内存 .C语言中动态内存分配(malloc)只在堆中分配一片内存,返回一个void指针(分配失败则返回0),并没有创建一个对象.使用时需要强制转换成恰当 ...
- 【C语言进阶深度学习记录】三十三 C语言中动态内存分配
如何在程序运行的时候动态给程序分配内存? 文章目录 1 动态内存分配的意义 1.1 C语言中如何动态申请内存空间 1.2 malloc和free的用法 1.3 calloc与realloc 1.31 ...
- C语言:动态内存分配
个人博客网址:https://ljsblog.com 动态内存分配(十) 在不知道所需要的空间大小的情况下,这时就可以使用动态内存开辟. 当开辟的空间不再使用时,用free函数来释放calloc.ma ...
- 【C语言】动态内存分配详解
目录 一.为什么有动态内存分配 二.动态内存分配函数 (1)malloc()函数 (2)calloc()函数 (3)realloc()函数 三.常见的动态内存错误 1.越界访问 2.内存泄漏 3.对N ...
- 【C语言】------ 动态内存分配
动态内存开辟详解 动态内存分配 什么是动态内存分配? 一.为什么使用动态内存分配呢? 二.动态内存函数 1.malloc和free 2.calloc和realloc 三.常见的动态内存错误 1.对`N ...
- C/C++——动态内存分配
动态内存分配,就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法.动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序 ...
- 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
最新文章
- 盲人计算机培训计划,中国盲人协会-河南省郑州市盲人按摩培训班教学大纲及计划...
- python好用-Python有哪些常见的、好用的爬虫框架?
- python PyQt5 QFrame类
- SPS2003升级到MOSS2007相关资料及问题总结
- sap权限激活_SA*P 自定义权限对象
- 清空网站浏览记录就行啦?看Python如何实时监控网站浏览记录
- 一张图带你了解python
- 【20090702-03】ArcEngine的类库介绍(转)
- 仿qq邮箱源码程序_小伙子利用C++实现邮件程序发送和接收
- Promise基本概念和基本示例使用
- 细说PHP:人人都能玩转PHP和MySQL Web开发
- 如何在DNN4下使用VS2005进行单元测试???
- Spring Cloud构建微服务架构(四)分布式配置中心(续)
- Linux的主动实行措施cron和crontab(1)
- 简单BP神经网络分类手写数字识别0-9
- 下列选项中完整描述计算机操作系统作用是,电影《八部半》中,古依多的童年是他生命的源泉,也是他灵魂的开端。...
- Volterra方程的不动点
- python 利用opencv实现颜色检测
- Golang 基础:原生并发 goroutine channel 和 select 常见使用场景
- mysql 安装版和解压版的区别_Mysql5.7解压版的安装和卸载及常见问题小结
热门文章
- java多线程 future_Java多线程Future模式
- java高效写文件_java如何高效读写10G以上大文件
- 缺陷调研报告_质量零缺陷 | 打造极致产品的质量管理之道
- axure原型怎么让文字自动换行_理解「回车」和「换行」,纠正数据输入过程中的坏习惯...
- 数据结构-哈希与映射
- 【JMeter】Threads(users)3种类型
- 从零开始的全栈工程师——js篇2.12(面向对象)
- HDU 2874 Connections between cities(LCA离线算法实现)
- 【LeetCode】031. Next Permutation
- python 内置模块-re