常见的内存错误及其对策-(公开课件).pptVIP

  • 0
  • 0
  • 约2.76千字
  • 约 15页
  • 2019-12-21 发布于广西
  • 举报

常见的内存错误及其对策-(公开课件).ppt

常见的内存错误及其对策 特点 编译器不能自动发现这类错误,通常是在程序运行时才能捕捉到 时隐时现,无明显症状 分类 内存分配未成功,却使用了它 内存分配成功,但是尚未初始化就引用它 内存分配成功,并且已经初始化,但操作越过了内存的边界 忘记了释放内存,造成内存泄漏 释放了内存,却继续使用它 常见的内存错误及其对策 常见错误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)

1亿VIP精品文档

相关文档