程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本章的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。

7.1内存分配方式 
内存分配方式有三种: 
(1)       从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 
(2)       在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 
(3)       从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 
7.2常见的内存错误及其对策 
       发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走,错误又发作了。 
常见的内存错误及其对策如下: 
u       内存分配未成功,却使用了它。 
编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。

u       内存分配虽然成功,但是尚未初始化就引用它。 
犯这种错误主要有两个起因:一是没有初始化的观念;二是误以为内存的缺省初值全为零,导致引用初值错误(例如数组)。 
内存的缺省初值究竟是什么并没有统一的标准,尽管有些时候为零值,我们宁可信其无不可信其有。所以无论用何种方式创建数组,都别忘了赋初值,即便是赋零值也不可省略,不要嫌麻烦。

u       内存分配成功并且已经初始化,但操作越过了内存的边界。 
例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for循环语句中,循环次数很容易搞错,导致数组操作越界。

u       忘记了释放内存,造成内存泄露。 
含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,你看不到错误。终有一次程序突然死掉,系统出现提示:内存耗尽。 
动态内存的申请与释放必须配对,程序中malloc与free的使用次数一定要相同,否则肯定有错误(new/delete同理)。 
u       释放了内存却继续使用它。 
有三种情况: 
(1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。 
(2)函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。 
(3)使用free或delete释放了内存后,没有将指针设置为NULL。导致产生“野指针”。

l         【规则7-2-1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。 
l         【规则7-2-2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。 
l         【规则7-2-3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。 
l         【规则7-2-4】动态内存的申请与释放必须配对,防止内存泄漏。 
l         【规则7-2-5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。

C语言内存管理(林锐博士的文章,绝对经典)相关推荐

  1. 读林锐博士的《软件工程思想》有感

    大三上学期学习<软件工程>这门课程,说实话,挺水的,都在纸上谈兵.老师上课也花很久很久讲写时事的东西,说到底,就是要让我们学会有自己的思想.老师一直推荐给我们上浙大的博士林锐写的<软 ...

  2. C语言内存管理超详解

    补充: 1.一个正在运行着的C编译程序占用的内存分为栈区.堆区.未初始化数据区(BBS).初始化数据区.代码区5个部分. (1)栈区:存放函数的参数值.局部变量的值.由编译器自动分配释放. (2)堆区 ...

  3. 【C语言重点难点精讲】C语言内存管理

    文章目录 一:相关动态内存函数 (1)malloc和free (2)calloc (3)realloc 二:进程地址空间 三:常见内存错误 C语言内存管理其实是一个很糟糕的话题,很烦这个,但是没有办法 ...

  4. C语言内存管理内幕(二)----半自动内存管理策略

    2019独角兽企业重金招聘Python工程师标准>>> C语言内存管理内幕(二)----半自动内存管理策略 转载于:https://my.oschina.net/hengcai001 ...

  5. 分享:流言终结者——C语言内存管理

    流言终结者--C语言内存管理 http://my.oschina.net/michaelyuanyuan/blog/104421

  6. C语言内存管理机制精讲-高手必修课视频教程-黄强-专题视频课程

    C语言内存管理机制精讲-高手必修课视频教程-384人已学习 课程介绍         在企业级项目开发中一个非常重要的设计就是如何有效地管理内存资源.在C语言中,关于内存管理的知识点比较多,如函数变量 ...

  7. C语言文件联系人管理碎片整理,深入理解C语言内存管理.docx

    深入理解C语言内存管理 之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少. 问题不能拖,我这就来学习一下吧,争取一次搞定 ...

  8. c语言malloc calloc,C语言内存管理:malloc、calloc、free的实现

    任何一个对C稍稍有了解的人都知道malloc.calloc.free.前面两个是用户态在堆上分配一段连续(虚拟地址)的内存空间,然后可以通过free释放,但是,同时也会有很多人对其背后的实现机制不了解 ...

  9. 内存管理模拟程序c语言,C语言 内存管理详解

    本文出自: 伟大的Bill Gates曾经失言: 640K ought to be enough for everybody -Bill Gates 1981. 程序员们经常编写内存管理程序,往往提心 ...

最新文章

  1. 有多少人在51job上找到工作_人不在日本,找到日本工作的最佳方案
  2. 编程珠玑第九章——习题
  3. Android之一起玩转下拉刷新控件
  4. 病症:arm启动后应用程序界面显示…
  5. bootice 此功能仅在uefi环境下可用_电脑新手必掌握基础知识:BIOS、EFI与UEFI详解!...
  6. CSS单位 px pt em和rem 之间的区别
  7. 交通灯c语言单片机课程设计,交通灯单片机课程设计C语言.doc
  8. 欧姆龙cp1h指令讲解_OMRON CP1H脉冲指令说明总结
  9. 科普一下: 关于C语言中的运算符优先级
  10. scikit-learn:回归分析—一元非线性回归
  11. Export2Excel实现多级表头以及多个sheet页
  12. mpp文件能转换成PDF
  13. 【SpringCloud】ZuulFilter过滤器
  14. (1)学习ArduPilot代码库
  15. Linux基础——makefile编写
  16. 留不住用户 FireFox中国市场占有率下跌8.6%
  17. 安科瑞Acrel-BUS智能照明控制系统在医院的应用
  18. python满天星效果图_客厅满天星地砖铺贴效果图 大厅瓷砖四角满天星造型图片...
  19. hadoop机架是什么_什么是机架?
  20. 获取手机屏幕大小 DisplayMetrics

热门文章

  1. 平行志愿计算机检索原理,平行志愿如何录取 看完院校投档原理就懂了
  2. Windows 98 操作系统 考试大纲
  3. Qt中常用的控件详细介绍
  4. 【指法练习】还在迷茫寒假要干什么事情吗?
  5. 爱创科技X腾讯安全:追溯生态体系赋能酒企数智化转型
  6. Calf Flac-usaco
  7. 计算机bpp是什么意思?(每像素位数 bits per pixel)
  8. iTerm2中配置SSH连接Linux服务器的快捷方法
  9. 新农慕课python答案、第七周_中国大学MOOC(慕课)_Python机器学习应用_章节答案期末答案...
  10. Spring boot 全面学习笔记(1)