C语言内存管理,林锐博士的文章,绝对经典

news/2024/6/29 11:10:16 标签: 语言, c, null, delete, 数据结构, 存储
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">

http://www.vcworld.net/news/200910/114918.html

 

class="vc_newsdisp">

欢迎进入内存这片雷区。伟大的Bill Gates 曾经失言: 
640K ought to be enough for everybody  — Bill Gates 1981

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

7.1内存分配方式
内存分配方式有三种:
(1)       从静态存储区域分配。内存在程序编译的时候就已经分配好࿰c;这块内存在程序的整个运行期间都存在。例如全局变量࿰c;static变量。
(2)       在栈上创建。在执行函数时࿰c;函数内局部变量的存储单元都可以在栈上创建࿰c;函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中࿰c;效率很高࿰c;但是分配的内存容量有限。
(3)       从堆上分配࿰c;亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存࿰c;程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定࿰c;使用非常灵活࿰c;但问题也最多。

7.2常见的内存错误及其对策 

       发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误࿰c;通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状࿰c;时隐时现࿰c;增加了改错的难度。有时用户怒气冲冲地把你找来࿰c;程序却没有发生任何问题࿰c;你一走࿰c;错误又发作了。
常见的内存错误及其对策如下: 

       内存分配未成功࿰c;却使用了它。
编程新手常犯这种错误࿰c;因为他们没有意识到内存分配会不成功。常用解决办法是࿰c;在使用内存之前检查指针是否为NULL。如果指针p是函数的参数࿰c;那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存࿰c;应该用if(p==NULL) 或if(p!=NULL)进行防错处理。 

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

 

 

 

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

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

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

cle>

http://www.niftyadmin.cn/n/1605408.html

相关文章

刷脸支付巨头相争非此即彼不能败

支付宝与微信的刷脸大战,被许多媒体形容为线下流量入口的争夺大战。其中一个逻辑也挺简单,前者受困于打开率却在社交上遭遇滑铁卢,无需依赖打开即能完成支付,当然足够振奋。而对后者来说,巨头相争,非此即彼…

地表最强“程序猿”发量增多指南

袁:Hi,希书,你最近怎么脸色这么差,连头发也感觉又少了很多?发:唉,别提了,最近我们有一批过保服务器要搞业务迁移,每天晚上都加班到3点以后。袁:我天&#xff…

刷脸支付服务商市场空白大有可为

扫码支付开启了中国新一代的支付浪潮,将支付带入新的高度,那么这个高度就是方便、快捷。扫码支付较现金支付无需找零、无需携带钱包,只需要扫码就可以完成支付,对于商家和顾客来说,支付变得简单多了。“炫技”是一方面…

【百科】Turbo C

http://baike.baidu.com/view/85273.htm 编辑本段Turbo C 发展概况 该公司在1987年首次推出Turbo C 1.0 产品, 其中使用了全然一新的集成开发环境, 即使用了一系列下拉式菜单,将文本编辑、程序编译、连接以及程序运行一体化, 大大方便了程序的开发。1988年, Borland 公司又推出…

AI应用 | 人工智能可以帮你理财?这事是真的!

AI能让人发家致富,这是真的吗?AI理财确实存在,但并不是以这样“简单粗暴”的方式使用的。它的应用范围更广,可以说智能理财时代的大门,才刚刚开启。AI理财是什么?其实无论是哪种金融理财产品,任…

掌优始终坚持技术价值与社会价值并重

上公交车时无需任何操作,乘客只需将脸对准智能人脸识别设备即可。“刷脸乘车”已不是新鲜事,全国各省市都在紧锣密鼓地推进“智慧交通”的建设。在我国上海、北京、济南、广州等地区,乘客可以直接在地铁站的人脸识别终端或自助票务机进行注册…

区块链丨拒绝虚假信息,优化你的网络社交生活

你有没有遇到过这种情况,朋友圈大量转发的“新闻”最后被澄清是假消息;同样一个视频内容,被很多人直接发到自己的社交账号,以此来博得关注。随着社会的发展与AI等一系列新技术的兴起,人们开始赋予社交产品更多新鲜玩法…

政策补贴用户培育用户的刷脸支付习惯

移动支付早已被国外青年们选为中国“新四大发明”,“码”上支付已经成为了生活必不可少的一部分。在我们习以为常的背后,一场由支付宝和微信支付主导的移动支付争夺战正在发生,不仅从线上延伸至线下,还将触角伸至更多领域。 与电…