[常见的内存错误及其对策.pptVIP

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[常见的内存错误及其对策

常见的内存错误及其对策 特点 编译器不能自动发现这类错误,通常是在程序运行时才能捕捉到 时隐时现,无明显症状 分类 内存分配未成功,却使用了它 内存分配成功,但是尚未初始化就引用它 内存分配成功,并且已经初始化,但操作越过了内存的边界 忘记了释放内存,造成内存泄漏 释放了内存,却继续使用它 常见的内存错误及其对策 常见错误1: 内存分配未成功,却使用了它 起因 没有意识到内存分配会不成功 编程新手容易犯 解决对策 在使用内存之前,检查指针是否为空指针(NULL) if (p == NULL) { printf(No enough memory!\n); exit(0); } 常见的内存错误及其对策 常见错误2: 内存分配成功,但是尚未初始化就引用它 起因 没有初始化的观念 误以为内存的默认值全为0 解决对策 即使是赋0值也不可省略,不要嫌麻烦 常见的内存错误及其对策 常见错误3: 内存分配成功,并且已经初始化,但操作越过了内存的边界 例如:使用数组时经常发生下标“多1”或者“少1”的操作 解决对策: 在for语句中,注意循环次数不要搞错 常见的内存错误及其对策 常见错误4: 忘记释放内存,造成内存泄漏(Memory Leak) “内存泄露”一词类似“原料泄露” 泄露出去的原料不能被利用,导致生产过程中原料不足 好比借东西不还 如果申请来的内存不用,别的程序也不能用,就好像这块内存泄露出去一样,造成浪费 常见的内存错误及其对策 特征 含有这种错误的函数,每被调用一次,就丢失一块内存(制造内存垃圾) 刚开始时,系统内存充足,看不到任何错误 当系统运行相当一段时间后,就会突然死掉,出现提示:内存耗尽 需长期稳定运行的服务程序对内存泄漏最敏感 严重程度取决于 每次遗留内存垃圾的多少 代码被调用的次数 常见的内存错误及其对策 解决对策 在需要的时候才malloc,并尽量减少malloc的次数 malloc的执行效率就不高,过多的malloc使程序性能下降 能用自动变量解决的问题,就不要用malloc来解决 malloc一般在大块内存分配和动态内存分配时使用 重复使用malloc申请到的内存 尽量让malloc和与之配套的free在一个函数或模块内 尽量把malloc集中在函数的入口处,free集中在函数的出口处 以上做法只能尽量降低产生泄露的概率。完全杜绝内存泄露,关键要靠程序员的细心与责任感 一个例子 void Init(void) { pszMyName=(char*)malloc(256); if (pszMyName == NULL) { return; } pszHerName=(char*)malloc(256); if (pszHerName == NULL) { return; } pszHisName=(char*)malloc(256); if (pszHisName == NULL) { return; } … … free(pszMyName); free(pszHerName); free(pszHisName); return; } 一个例子 void Init(void) { pszMyName=(char*)malloc(256); if (pszMyName == NULL) { return; } pszHerName=(char*)malloc(256); if (pszHerName == NULL) { free(pszMyName); return; } pszHisName=(char*)malloc(256); if (pszHisName == NULL) { free(pszMyName); free(pszHerName); return; } … … free(pszMyName); free(pszHerName); free(pszHisName); return; } 常见的内存错误及其对策 常见错误5: 释放了内存,却继续使用它 起因: 指针所指的内存被释放以后,并不表示指针会消亡 其地址仍然不变(非NULL),只是该地址对应的内存是垃圾 指向垃圾内存的指针是“野指针” 常见的内存错误及其对策 char* GetInput(void) { char s[80]; scanf(%s, s); return s; } warning C4172:

文档评论(0)

xiayutian80 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档