- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言程序稳定性
提高C语言程序运行稳定性的方法
一、前言
?
由于C语言的灵活性,用C语言开发出来的程序容易造成内存泄漏、运行异常、运行结果不可预期等程序质量问题,在用C语言开发程序的过程中,必须高度重视程序质量问题,应当把提高程序稳定性的方法加入到项目管理和开发过程中,最大限度地提高程序的稳定性,保证项目的成功开发。在这里总结多年来的C语言开发经验,拿出来共享以期在这方面能够得到更多的指教。
?
二、影响程序稳定性的因素
?
1、内存泄漏。造成内存泄漏的原因有:
1)、程序有多个出口,但不能保证在每一个出口能够完全释放掉所有的动态内存,如函数内有多个“return”,但没有在每一个“return”前释放掉在原已申请但必须释放的动态内存;
2)、对于“struct”数据结构,没有完全释放掉每一个指向动态内存的指针,如只释放指向“struct”数据结构指针没有释放“struct”体内的指针或某些指针被漏释放;
3)、对于用动态内存建立的链表在释放时没有一个一个结点去释放;
4)、一段动态内存空间原来只被一个指针引用,但在这个指针引用另外一段内存空间的时候,该段内存没有被释放;
5)、对于在函数内申请但必须在函数外释放的动态内存,在对该内存使用后忽略该动态内存的释放;
6)、用户强行退出程序,程序在退出前不能完全释放掉所有的动态内存;
7)、程序运行过程中发生了异常导致动态内存未被释放。
?
2、程序运行发生异常。造成异常产生的原因有:
1)、释放指针时该指针为空或是一个已被释放但释放后未被置空的指针;
2)、对于C库中的函数,如字符串操作函数,在调用该类函数时实参为空指针或者改指针没有指向可用的内存地址空间或者所指向的内存空间大小不足以用来实现当前的字符串操作;
3)、对于指向一个“struct”数据结构的指针,当指针为空时使用“struct”的分体数据;
4)、数组或指针发生越界操作;
5)、指针指向一个已被释放但释放后未被置空的指针,如一个全局变量的指针,在一个地方被释放后,但指针值未被置空,这时在另一个地方引用该指针的值时会发生异常;
6)、更改定义为常量的值;
7)、动态申请完一个内存后,未检查是否申请成功就调用了该指针;
8)、对于一块连续的内存块和“struct”数据结构在第一次使用时没有做初始化操作。
9)、在用非ASCII(如中文字符、Unicode)编码时,若使用char*来申请空间,在用C库中的字符串操作函数来操作,会因无法判断字符串结束位置而产生异常。
10)、指针类型强制转换时,当强制转换后指针指向的内存空间大于原来指针指向的内存空间时可能会出现异常(取决于堆或栈空间的结构和大小),如把“INT12*”强制转换成“INT32*”,应当尽量避免指针类型的强制转换;
11)、更改了数据结构,但代码没有相应更新或整个工程中相关文件没有做相应更新;
12)、申请的栈空间或堆空间超出了系统的容量限制;
13)、栈溢出,当函数中定义一个太大的数组时容易造成栈溢出,递归调用太深也容易造成栈举出;
14)、全局变量使用混乱,造成程序错乱;
16)、内存碎片太多,造成内存分配失败而导致程序异常,如建立一个太长的链表容易造成大量内存碎片;
17)、文件操作过于频繁(特别是写操作),系统应付不过来容易造成程序出现异常,这个在嵌入式系统中较常见。
?
三、内存泄漏预防措施
?
1、在代码审查时,检查函数体内的每一个“return”前是否有没有释放必须要释放的指针;
2、设计“struct”数据结构时,应当设计相应的释放“struct”指针的函数,并确保所有的“struct”体内的指针都被释放;
3、对于用动态内存建立的链表在释放时要一个一个结点去释放, 对于每一个链表也要有相应的链表内存管理函数,如链表的释放函数;
4、当一个指针变量要指向另一个动态内存地址时先检查一下该指针是否有指向另一个动态内存地址,如果有则应当考虑是否要先释放掉原先的指向的动态内存;
5、在调用一个函数时,对于函数的输出值要确认值的内存空间是否是在函数内部动态申请,如果是则应当考虑是适当的时候把它释放掉;
6、减少程序的出口的数目,最好是一个出口,在出口处理函数中确保释放所有的动态内存;
7、当用户强行退出时,要考虑在每一个退出点是否能够释放所有的动态内存;
8、释放掉一个指针所指的内存空间后,就立即把改指针置为空;
9、少用动态申请内存,能用数组代替的就用数组的形式;
10、尽量减少全局变量的使用,避免指针指向的混乱;
11、封
文档评论(0)