5.内存管理5.6杜绝野指针-漫索.ppt

上传人:ga****84 文档编号:359956 上传时间:2018-09-26 格式:PPT 页数:12 大小:513.50KB
下载 相关 举报
5.内存管理5.6杜绝野指针-漫索.ppt_第1页
第1页 / 共12页
5.内存管理5.6杜绝野指针-漫索.ppt_第2页
第2页 / 共12页
5.内存管理5.6杜绝野指针-漫索.ppt_第3页
第3页 / 共12页
5.内存管理5.6杜绝野指针-漫索.ppt_第4页
第4页 / 共12页
5.内存管理5.6杜绝野指针-漫索.ppt_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、C+/C编程规范 帮助程序员一次性编写出高质量的程序 林 锐 博士http:/ ,上 海 漫 索 计 算 机 科 技 有 限 公 司,目录,0. 编程老手和高手的误区1. 程序的版式 2. 命名规则3. 表达式和基本语句4. 函数设计5. 内存管理6. C+/C试题与答案,代码检查表,详见 高质量程序设计指南C+/C语言(第二版),0. 编程老手和高手的误区,自我臭美的程序员程序员不同于武林人士,我们不要崇拜邪派高手 大学计算机教育的失误:从来就没有重视质量,绝大多数学士、硕士、博士不了解软件质量,不知道如何有效地提高软件的质量。 高校毕业生C+/C编程考试的结果:程序质量低下什么是编程老手:

2、能够长期稳定地编写出高质量程序的程序员什么是编程高手:能够长期稳定地编写出高难度、高质量程序的程序员,1. 程序的版式,1.1 文件结构 版权和版本头文件的作用 头文件和定义文件的结构,正确使用include,ifndef/define/endif 目录结构1.2 版式空行,代码行 代码行内的空格对齐 修饰符 * & 的位置 注释类的版式:public, private 前后之争,2. 命名规则,不要追求世界上最好的命名规则!在机构内部一致即可。匈牙利法的利弊一些共性规则:直观并且可以拼读,可望文知意,不必“解码”。 名字的长度:min-length & max-information 原则

3、与操作系统和开发工具的风格保持一致 程序中不要出现仅靠大小写区分的相似的标识符 程序中不要出现标识符完全相同的局部变量和全局变量 变量的名字应当使用“名词”或者“形容词名词” 全局函数的名字应当使用“动词”或者“动词名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等 尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号,3. 表达式和基本语句,3.1 表达式如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。 不要编写太复杂的复合表达式。 不要把程序中

4、的复合表达式与“真正的数学表达式”混淆。例如 if (a b c) 3.2 你会编写正确的 if 语句吗布尔变量与零值比较整型变量与零值比较浮点变量与零值比较指针变量与零值比较为什么有人用 If(NULL = P) 这样“古怪”的格式3.3 循环语句在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。 建议for语句的循环控制变量的取值采用“半开半闭区间”写法。 3.4 switch, goto ,4. 函数设计,4.1 参数的规则参数的书写要完整,不要贪图省事只写

5、参数的类型而省略参数名字。 参数命名要恰当,顺序要合理。 示例 StringCopy(char *str1,char *str2)如果参数是指针,且仅做输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。 避免函数有太多的参数,参数个数尽量控制在5个以内。如果参数太多,在使用时容易将参数类型或顺序搞错。 尽量不要使用类型和数目不确定的参数。例如 printf4.2 返回值的规则不要省略返回值的类型。函数名字与返回值类型在语义上不可冲突。例如 getchar不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return语句返回。 有时候函数原本不需要返回值,但

6、为了增加灵活性如支持链式表达,可以附加返回值。例如 char *strcpy(char *strDest,const char *strSrc);4.3 函数内部实现的规则:在函数体的“入口处”和“出口处”从严把关 在函数体的“入口处”,对参数的有效性进行检查。 在函数体的“出口处”,对return语句的正确性和效率进行检查。,4. 函数设计,4.4 一些建议函数的功能要单一,不要设计多用途的函数。 函数体的规模要小,尽量控制在50行代码之内。 尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出。带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种“记忆状态”。

7、不仅要检查输入参数的有效性,还要检查通过其他途径进入函数体内的变量的有效性,例如全局变量、文件句柄等。 用于出错处理的返回值一定要清楚,让使用者不容易忽视或误解错误情况。 4.5 使用断言使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要做出处理的。 在函数的入口处,使用断言检查参数的有效性(合法性)。 在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。,5. 内存管理,5.1 内存分配方式从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全

8、局变量,static变量。 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 5.2 常见的内存错误内存分配未成功,却使用了它。 内存分配虽然成功,但是尚未初始化就引用它。 内存分配成功并且已经初始化,但操作越过了内存的边界。 忘记了释放内存,造成内存泄漏。 释放了内存

9、却继续使用它,5. 内存管理,5.3 对策用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。 不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。 动态内存的申请与释放必须配对,防止内存泄漏。 用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。 5.4 free 和 delete 把指针怎么啦?它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。 指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃

10、圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。 如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。 “野指针”示例5.5 动态内存会被自动释放吗?示例指针消亡了,并不表示它所指的内存会被自动释放。 内存被释放了,并不表示指针会消亡或者成了NULL指针。,5. 内存管理,5.6 杜绝野指针“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断

11、。但是“野指针”是很危险的,if语句对它不起作用。 “野指针”的成因主要有三种: 指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的默认值是随机的,它会乱指一气。 指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。 指针操作超越了变量的作用范围。这种情况让人防不胜防 5.7 有了malloc/free 为什么还要new/deleteMalloc/free 是库函数,new/delete是运算符。 光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C+语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。 5.8 内存耗尽怎么办?5.9 建议:必须养成“使用调试器逐步跟踪程序”的习惯,只有这样才能发现问题的本质。,6. C+/C试题与答案,代码检查表,详见高质量程序设计指南C+/C语言(第二版)的附录,电子工业出版社,2003年6月,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。