您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 常见的内存错误及其对策
常见的内存错误及其对策特点–编译器不能自动发现这类错误,通常是在程序运行时才能捕捉到–时隐时现,无明显症状分类–内存分配未成功,却使用了它–内存分配成功,但是尚未初始化就引用它–内存分配成功,并且已经初始化,但操作越过了内存的边界–忘记了释放内存,造成内存泄漏–释放了内存,却继续使用它常见的内存错误及其对策常见错误1:–内存分配未成功,却使用了它起因–没有意识到内存分配会不成功–编程新手容易犯解决对策–在使用内存之前,检查指针是否为空指针(NULL)if(p==NULL){printf(Noenoughmemory!\n);exit(0);}常见的内存错误及其对策常见错误2:–内存分配成功,但是尚未初始化就引用它起因–没有初始化的观念–误以为内存的默认值全为0解决对策–即使是赋0值也不可省略,不要嫌麻烦常见的内存错误及其对策常见错误3:–内存分配成功,并且已经初始化,但操作越过了内存的边界–例如:使用数组时经常发生下标“多1”或者“少1”的操作解决对策:–在for语句中,注意循环次数不要搞错常见的内存错误及其对策常见错误4:–忘记释放内存,造成内存泄漏(MemoryLeak)–“内存泄露”一词类似“原料泄露”–泄露出去的原料不能被利用,导致生产过程中原料不足–好比借东西不还–如果申请来的内存不用,别的程序也不能用,就好像这块内存泄露出去一样,造成浪费常见的内存错误及其对策特征–含有这种错误的函数,每被调用一次,就丢失一块内存(制造内存垃圾)–刚开始时,系统内存充足,看不到任何错误–当系统运行相当一段时间后,就会突然死掉,出现提示:内存耗尽–需长期稳定运行的服务程序对内存泄漏最敏感–严重程度取决于每次遗留内存垃圾的多少代码被调用的次数常见的内存错误及其对策解决对策–在需要的时候才malloc,并尽量减少malloc的次数malloc的执行效率就不高,过多的malloc使程序性能下降能用自动变量解决的问题,就不要用malloc来解决malloc一般在大块内存分配和动态内存分配时使用–重复使用malloc申请到的内存–尽量让malloc和与之配套的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){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(pszMyName);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);returns;}warningC4172:returningaddressoflocalvariableortemporary输出乱码voidGetInput(char*s){scanf(%s,s);}错在哪里!不能把局部变量的地址作为返回值返回函数返回后,局部变量被释放,该地址的内存会被挪做它用常见的内存错误及其对策#includestdio.h#includestdlib.hvoidGetInput(char*p){p=(char*)malloc(100);}程序崩溃,函数不能传递动态分配的内存?voidGetInput(char**p){*p=(char*)malloc(100);}常见的内存错误及其对策常见错误5解决对策–尽量把malloc集中在函数的入口处,free集中在函数的出口处–如果free不能放在函数出口处,则指针free后立即设置为NULL–不要把局部变量的地址作为返回值返回,因为该内存在函数体结束时被自动销毁–指针要么初始化为NULL,要么是其指向合法的内存非法内存操作起因–内存分配未成功,却使用了它–内存分配成功,但是尚未初始化就引用它–内存分配成功,并且已经初始化,但操作越过了内存的边界–释放了内存,却继续使用它基本特征–代码访问了不该访问的内存地址非法内存操作后果宣布安乐死:“该程序执行了非法操作,即将关闭”–几乎全是由指针混乱导致的–少数情况下,如在硬件驱动程序中的内存问题会造成操作系统的死亡–最糟糕的不是系统死机,而是重要资料被窃取
本文标题:常见的内存错误及其对策
链接地址:https://www.777doc.com/doc-3237461 .html