欢迎来到天天文库
浏览记录
ID:5589068
大小:310.50 KB
页数:15页
时间:2017-11-16
《常见的内存错误及其对策》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、常见的内存错误及其对策特点编译器不能自动发现这类错误,通常是在程序运行时才能捕捉到时隐时现,无明显症状分类内存分配未成功,却使用了它内存分配成功,但是尚未初始化就引用它内存分配成功,并且已经初始化,但操作越过了内存的边界忘记了释放内存,造成内存泄漏释放了内存,却继续使用它常见的内存错误及其对策常见错误1:内存分配未成功,却使用了它起因没有意识到内存分配会不成功编程新手容易犯解决对策在使用内存之前,检查指针是否为空指针(NULL)if(p==NULL){printf("Noenoughmemory!");exit(0);}常见的内存错误及其对策常见错误2:
2、内存分配成功,但是尚未初始化就引用它起因没有初始化的观念误以为内存的默认值全为0解决对策即使是赋0值也不可省略,不要嫌麻烦常见的内存错误及其对策常见错误3:内存分配成功,并且已经初始化,但操作越过了内存的边界例如:使用数组时经常发生下标“多1”或者“少1”的操作解决对策:在for语句中,注意循环次数不要搞错常见的内存错误及其对策常见错误4:忘记释放内存,造成内存泄漏(MemoryLeak)“内存泄露”一词类似“原料泄露”泄露出去的原料不能被利用,导致生产过程中原料不足好比借东西不还如果申请来的内存不用,别的程序也不能用,就好像这块内存泄露出去一样,造成浪费常
3、见的内存错误及其对策特征含有这种错误的函数,每被调用一次,就丢失一块内存(制造内存垃圾)刚开始时,系统内存充足,看不到任何错误当系统运行相当一段时间后,就会突然死掉,出现提示:内存耗尽需长期稳定运行的服务程序对内存泄漏最敏感严重程度取决于每次遗留内存垃圾的多少代码被调用的次数常见的内存错误及其对策解决对策在需要的时候才malloc,并尽量减少malloc的次数malloc的执行效率就不高,过多的malloc使程序性能下降能用自动变量解决的问题,就不要用malloc来解决malloc一般在大块内存分配和动态内存分配时使用重复使用malloc申请到的内存尽量让m
4、alloc和与之配套的free在一个函数或模块内尽量把malloc集中在函数的入口处,free集中在函数的出口处以上做法只能尽量降低产生泄露的概率。完全杜绝内存泄露,关键要靠程序员的细心与责任感一个例子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)
5、{return;}……free(pszMyName);free(pszHerName);free(pszHisName);return;}错在哪里!一个例子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(p
6、szMyName);free(pszHerName);return;}……free(pszMyName);free(pszHerName);free(pszHisName);return;}常见的内存错误及其对策常见错误5:释放了内存,却继续使用它起因:指针所指的内存被释放以后,并不表示指针会消亡其地址仍然不变(非NULL),只是该地址对应的内存是垃圾指向垃圾内存的指针是“野指针”…free(ptr);if(ptr!=NULL)//不起作用{…}常见的内存错误及其对策char*GetInput(void){chars[80];scanf("%s",s);r
7、eturns;}warningC4172:returningaddressoflocalvariableortemporary输出乱码voidGetInput(char*s){scanf("%s",s);}错在哪里!不能把局部变量的地址作为返回值返回函数返回后,局部变量被释放,该地址的内存会被挪做它用常见的内存错误及其对策#include#includevoidGetInput(char*p){p=(char*)malloc(100);}程序崩溃,函数不能传递动态分配的内存?voidGetInput(char**p
8、){*p=(char*)malloc(100);}常
此文档下载收益归作者所有