欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    常见的内存错误及其对策精.ppt

    • 资源ID:65052862       资源大小:1.32MB        全文页数:15页
    • 资源格式: PPT        下载积分:18金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要18金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    常见的内存错误及其对策精.ppt

    常见的内存错误及其对策常见的内存错误及其对策常见的内存错误及其对策常见的内存错误及其对策第1页,本讲稿共15页常见的内存错误及其对策常见的内存错误及其对策 常见错误常见错误1:内存分配未成功,却使用了它内存分配未成功,却使用了它内存分配未成功,却使用了它内存分配未成功,却使用了它 起因起因没有意识到内存分配会不成功没有意识到内存分配会不成功没有意识到内存分配会不成功没有意识到内存分配会不成功编程新手容易犯编程新手容易犯编程新手容易犯编程新手容易犯 解决对策解决对策在使用内存之前,检查指针是否为空指针(在使用内存之前,检查指针是否为空指针(在使用内存之前,检查指针是否为空指针(在使用内存之前,检查指针是否为空指针(NULLNULL)ifif(p=NULL)(p=NULL)printf(No enough memory!n);printf(No enough memory!n);exit(0);exit(0);第2页,本讲稿共15页常见的内存错误及其对策常见的内存错误及其对策 常见错误常见错误2 2:内存分配成功,但是尚未初始化就引用它内存分配成功,但是尚未初始化就引用它内存分配成功,但是尚未初始化就引用它内存分配成功,但是尚未初始化就引用它 起因起因没有初始化的观念没有初始化的观念没有初始化的观念没有初始化的观念误以为内存的默认值全为误以为内存的默认值全为误以为内存的默认值全为误以为内存的默认值全为0 0 0 0 解决对策解决对策即使是赋即使是赋即使是赋即使是赋0 0 0 0值也不可省略,不要嫌麻烦值也不可省略,不要嫌麻烦值也不可省略,不要嫌麻烦值也不可省略,不要嫌麻烦第3页,本讲稿共15页常见的内存错误及其对策常见的内存错误及其对策 常见错误常见错误3:内存分配成功,并且已经初始化,但操作越过了内存的内存分配成功,并且已经初始化,但操作越过了内存的内存分配成功,并且已经初始化,但操作越过了内存的内存分配成功,并且已经初始化,但操作越过了内存的边界边界边界边界例如:例如:例如:例如:使用数组时经常发生下标使用数组时经常发生下标使用数组时经常发生下标使用数组时经常发生下标“多多多多1”1”或者或者或者或者“少少少少1”1”的操的操的操的操作作作作 解决对策:解决对策:在在在在forfor语句中,注意循环次数不要搞错语句中,注意循环次数不要搞错第4页,本讲稿共15页常见的内存错误及其对策常见的内存错误及其对策 常见错误常见错误4:忘记释放内存,造成忘记释放内存,造成忘记释放内存,造成忘记释放内存,造成内存泄漏内存泄漏内存泄漏内存泄漏(Memory Leak)(Memory Leak)“内存泄露内存泄露”一词类似一词类似“原料泄露原料泄露”泄露出去的原料不能被利用,导致生产过程中原料不泄露出去的原料不能被利用,导致生产过程中原料不泄露出去的原料不能被利用,导致生产过程中原料不泄露出去的原料不能被利用,导致生产过程中原料不足足足足好比借东西不还好比借东西不还好比借东西不还好比借东西不还如果申请来的内存不用,别的程序也不能用,就如果申请来的内存不用,别的程序也不能用,就好像这块内存泄露出去一样,造成浪费好像这块内存泄露出去一样,造成浪费第5页,本讲稿共15页常见的内存错误及其对策常见的内存错误及其对策 特征特征含有这种错误的函数,每被调用一次,就丢失一含有这种错误的函数,每被调用一次,就丢失一块内存(制造内存垃圾)块内存(制造内存垃圾)刚开始时,系统内存充足,看不到任何错误刚开始时,系统内存充足,看不到任何错误刚开始时,系统内存充足,看不到任何错误刚开始时,系统内存充足,看不到任何错误当系统运行相当一段时间后,就会突然死掉,出当系统运行相当一段时间后,就会突然死掉,出现提示:内存耗尽现提示:内存耗尽需长期稳定运行的服务程序对内存泄漏最敏感需长期稳定运行的服务程序对内存泄漏最敏感需长期稳定运行的服务程序对内存泄漏最敏感需长期稳定运行的服务程序对内存泄漏最敏感严重程度取决于严重程度取决于严重程度取决于严重程度取决于 每次遗留内存垃圾的多少每次遗留内存垃圾的多少每次遗留内存垃圾的多少每次遗留内存垃圾的多少 代码被调用的次数代码被调用的次数代码被调用的次数代码被调用的次数第6页,本讲稿共15页常见的内存错误及其对策常见的内存错误及其对策 解决对策解决对策在需要的时候才在需要的时候才在需要的时候才在需要的时候才mallocmalloc,并尽量减少,并尽量减少,并尽量减少,并尽量减少mallocmalloc的次数的次数的次数的次数 mallocmalloc的执行效率就不高,过多的的执行效率就不高,过多的的执行效率就不高,过多的的执行效率就不高,过多的mallocmalloc使程序性能下降使程序性能下降使程序性能下降使程序性能下降 能用自动变量解决的问题,就不要用能用自动变量解决的问题,就不要用能用自动变量解决的问题,就不要用能用自动变量解决的问题,就不要用mallocmalloc来解决来解决来解决来解决 mallocmalloc一般在大块内存分配和动态内存分配时使用一般在大块内存分配和动态内存分配时使用一般在大块内存分配和动态内存分配时使用一般在大块内存分配和动态内存分配时使用重复使用重复使用重复使用重复使用mallocmalloc申请到的内存申请到的内存申请到的内存申请到的内存尽量让尽量让尽量让尽量让mallocmalloc和与之配套的和与之配套的和与之配套的和与之配套的freefree在一个函数或模块内在一个函数或模块内在一个函数或模块内在一个函数或模块内 尽量把尽量把尽量把尽量把mallocmalloc集中在函数的入口处,集中在函数的入口处,集中在函数的入口处,集中在函数的入口处,freefree集中在函数的出口集中在函数的出口集中在函数的出口集中在函数的出口处处处处 以上做法只能尽量降低产生泄露的概率。完全杜以上做法只能尽量降低产生泄露的概率。完全杜绝内存泄露,关键要靠程序员的细心与责任感绝内存泄露,关键要靠程序员的细心与责任感第7页,本讲稿共15页一个例子一个例子voidvoid Init(Init(voidvoid)pszMyName=(pszMyName=(charchar*)malloc(256);*)malloc(256);ifif(pszMyName=NULL)(pszMyName=NULL)returnreturn;pszHerName=(pszHerName=(charchar*)malloc(256);*)malloc(256);ifif(pszHerName=NULL)(pszHerName=NULL)returnreturn;pszHisName=(pszHisName=(charchar*)malloc(256);*)malloc(256);if if(pszHisName=NULL)(pszHisName=NULL)returnreturn;free(pszMyName);free(pszMyName);free(pszHerName);free(pszHerName);free(pszHisName);free(pszHisName);returnreturn;错在哪里!错在哪里!第8页,本讲稿共15页一个例子一个例子voidvoid Init(Init(voidvoid)pszMyName=(pszMyName=(charchar*)malloc(256);*)malloc(256);ifif(pszMyName=NULL)(pszMyName=NULL)returnreturn;pszHerName=(pszHerName=(charchar*)malloc(256);*)malloc(256);ifif(pszHerName=NULL)(pszHerName=NULL)free(pszMyName);free(pszMyName);returnreturn;pszHisName=(pszHisName=(charchar*)malloc(256);*)malloc(256);if if(pszHisName=NULL)(pszHisName=NULL)free(pszMyName);free(pszMyName);free(pszHerName);free(pszHerName);returnreturn;free(pszMyName);free(pszMyName);free(pszHerName);free(pszHerName);free(pszHisName);free(pszHisName);returnreturn;第9页,本讲稿共15页常见的内存错误及其对策常见的内存错误及其对策 常见错误常见错误5 5:释放了内存,却继续使用它释放了内存,却继续使用它释放了内存,却继续使用它释放了内存,却继续使用它 起因:起因:指针所指的内存被释放以后,并不表示指针会消亡指针所指的内存被释放以后,并不表示指针会消亡指针所指的内存被释放以后,并不表示指针会消亡指针所指的内存被释放以后,并不表示指针会消亡其地址仍然不变(非其地址仍然不变(非其地址仍然不变(非其地址仍然不变(非NULLNULL),只是该地址对应的内存),只是该地址对应的内存),只是该地址对应的内存),只是该地址对应的内存是垃圾是垃圾是垃圾是垃圾指向垃圾内存的指针是指向垃圾内存的指针是“野指针野指针野指针野指针”free(ptr);free(ptr);ifif(ptr!=NULL)(ptr!=NULL)/不起作用不起作用不起作用不起作用 第10页,本讲稿共15页常见的内存错误及其对策常见的内存错误及其对策 charchar*GetInput(*GetInput(voidvoid)charchar s80;s80;scanf(scanf(%s%s,s);,s);returnreturn s;s;warning C4172:returning address of local variable warning C4172:returning address of local variable or temporaryor temporary 输出乱码输出乱码输出乱码输出乱码 voidvoid GetInput(GetInput(charchar*s)*s)scanf(scanf(%s%s,s);,s);错在哪里!错在哪里!不能把局部变量的地址作为返不能把局部变量的地址作为返不能把局部变量的地址作为返不能把局部变量的地址作为返回值返回回值返回回值返回回值返回函数返回后,局部变量被释放,该函数返回后,局部变量被释放,该地址的内存会被挪做它用地址的内存会被挪做它用第11页,本讲稿共15页常见的内存错误及其对策常见的内存错误及其对策#includeinclude#includeinclude voidvoid GetInput(GetInput(charchar*p)*p)p=(p=(charchar *)malloc(100);)malloc(100);程序崩溃,函数不能传递动态分配的内存程序崩溃,函数不能传递动态分配的内存程序崩溃,函数不能传递动态分配的内存程序崩溃,函数不能传递动态分配的内存?voidvoid GetInput(GetInput(charchar *p)p)*p=(p=(char*char*)malloc(100);)malloc(100);第12页,本讲稿共15页常见的内存错误及其对策常见的内存错误及其对策 常见错误常见错误5解决对策解决对策尽量把尽量把尽量把尽量把mallocmalloc集中在函数的入口处,集中在函数的入口处,集中在函数的入口处,集中在函数的入口处,freefree集中在集中在集中在集中在函数的出口处函数的出口处函数的出口处函数的出口处如果如果如果如果free不能放在函数出口处不能放在函数出口处不能放在函数出口处不能放在函数出口处,则指针则指针则指针则指针freefree后立即后立即设置为设置为NULL不要把局部变量的地址作为返回值返回,因为该内存在不要把局部变量的地址作为返回值返回,因为该内存在不要把局部变量的地址作为返回值返回,因为该内存在不要把局部变量的地址作为返回值返回,因为该内存在函数体结束时被自动销毁函数体结束时被自动销毁函数体结束时被自动销毁函数体结束时被自动销毁指针要么初始化为指针要么初始化为指针要么初始化为指针要么初始化为NULL,要么是其指向合法的内存,要么是其指向合法的内存,要么是其指向合法的内存,要么是其指向合法的内存第13页,本讲稿共15页非法内存操作非法内存操作 起因起因内存分配未成功,却使用了它内存分配未成功,却使用了它内存分配未成功,却使用了它内存分配未成功,却使用了它内存分配成功,但是尚未初始化就引用它内存分配成功,但是尚未初始化就引用它内存分配成功,但是尚未初始化就引用它内存分配成功,但是尚未初始化就引用它内存分配成功,并且已经初始化,但操作越过了内存分配成功,并且已经初始化,但操作越过了内存的边界内存的边界释放了内存,却继续使用它释放了内存,却继续使用它 基本特征基本特征代码访问了不该访问的内存地址代码访问了不该访问的内存地址代码访问了不该访问的内存地址代码访问了不该访问的内存地址第14页,本讲稿共15页非法内存操作非法内存操作 后果后果 宣布安乐死:宣布安乐死:“该程序执行了非法操作,即将该程序执行了非法操作,即将关闭关闭”几乎全是由指针混乱导致的几乎全是由指针混乱导致的几乎全是由指针混乱导致的几乎全是由指针混乱导致的少数情况下,如在硬件驱动程序中的内存问题会造少数情况下,如在硬件驱动程序中的内存问题会造成操作系统的死亡成操作系统的死亡最糟糕的不是系统死机,而是重要资料被窃取最糟糕的不是系统死机,而是重要资料被窃取最糟糕的不是系统死机,而是重要资料被窃取最糟糕的不是系统死机,而是重要资料被窃取第15页,本讲稿共15页

    注意事项

    本文(常见的内存错误及其对策精.ppt)为本站会员(石***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开