常见的内存错误及其对策_第1页
常见的内存错误及其对策_第2页
常见的内存错误及其对策_第3页
常见的内存错误及其对策_第4页
常见的内存错误及其对策_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

常见的内存错误及其对策第1页,共15页,2023年,2月20日,星期一常见的内存错误及其对策常见错误1:内存分配未成功,却使用了它起因没有意识到内存分配会不成功编程新手容易犯解决对策在使用内存之前,检查指针是否为空指针(NULL)

if(p==NULL) { printf("Noenoughmemory!\n"); exit(0); }第2页,共15页,2023年,2月20日,星期一常见的内存错误及其对策常见错误2:内存分配成功,但是尚未初始化就引用它起因没有初始化的观念误以为内存的默认值全为0解决对策即使是赋0值也不可省略,不要嫌麻烦第3页,共15页,2023年,2月20日,星期一常见的内存错误及其对策常见错误3:内存分配成功,并且已经初始化,但操作越过了内存的边界例如:使用数组时经常发生下标“多1”或者“少1”的操作解决对策:在for语句中,注意循环次数不要搞错第4页,共15页,2023年,2月20日,星期一常见的内存错误及其对策常见错误4:忘记释放内存,造成内存泄漏(MemoryLeak)“内存泄露”一词类似“原料泄露”泄露出去的原料不能被利用,导致生产过程中原料不足好比借东西不还如果申请来的内存不用,别的程序也不能用,就好像这块内存泄露出去一样,造成浪费第5页,共15页,2023年,2月20日,星期一常见的内存错误及其对策特征含有这种错误的函数,每被调用一次,就丢失一块内存(制造内存垃圾)刚开始时,系统内存充足,看不到任何错误当系统运行相当一段时间后,就会突然死掉,出现提示:内存耗尽需长期稳定运行的服务程序对内存泄漏最敏感严重程度取决于每次遗留内存垃圾的多少代码被调用的次数第6页,共15页,2023年,2月20日,星期一常见的内存错误及其对策解决对策在需要的时候才malloc,并尽量减少malloc的次数malloc的执行效率就不高,过多的malloc使程序性能下降能用自动变量解决的问题,就不要用malloc来解决malloc一般在大块内存分配和动态内存分配时使用重复使用malloc申请到的内存尽量让malloc和与之配套的free在一个函数或模块内尽量把malloc集中在函数的入口处,free集中在函数的出口处以上做法只能尽量降低产生泄露的概率。完全杜绝内存泄露,关键要靠程序员的细心与责任感第7页,共15页,2023年,2月20日,星期一一个例子voidInit(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;}

错在哪里!第8页,共15页,2023年,2月20日,星期一一个例子voidInit(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;}第9页,共15页,2023年,2月20日,星期一常见的内存错误及其对策常见错误5:释放了内存,却继续使用它起因:指针所指的内存被释放以后,并不表示指针会消亡其地址仍然不变(非NULL),只是该地址对应的内存是垃圾指向垃圾内存的指针是“野指针”…free(ptr); if(ptr!=NULL)//不起作用{ …}第10页,共15页,2023年,2月20日,星期一常见的内存错误及其对策char*GetInput(void)

{

chars[80];

scanf("%s",s);

returns;

}

warningC4172:returningaddressoflocalvariableortemporary输出乱码voidGetInput(char*s)

{

scanf("%s",s);

}

错在哪里!不能把局部变量的地址作为返回值返回函数返回后,局部变量被释放,该地址的内存会被挪做它用第11页,共15页,2023年,2月20日,星期一常见的内存错误及其对策#include<stdio.h>#include<stdlib.h>voidGetInput(char*p){ p=(char

*)malloc(100);}程序崩溃,函数不能传递动态分配的内存?voidGetInput(char

**p){

*p=(char*)malloc(100);}第12页,共15页,2023年,2月20日,星期一常见的内存错误及其对策常见错误5解决对策尽量把malloc集中在函数的入口处,free集中在函数的出口处如果free不能放在函数出口处,则指针free后立即设置为NULL不要把局部变量的地址作为返回值返回,因为该内存在函数体结束时被自动销毁指针要么初始化为NULL,要么是其指向合法的内存第13页,共15页,2023年,2月20日,星期一非法内存操作起因内存分配未成功,却使用了它内存分配成功,但是尚未初始化就引用它内存分配成功,并且已经初始化,但操作越过了内存的边界释放了内存,却继续使用它基本特征代码访问了不该访问的内存地

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论