




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
常见的内存错误及其对策 特点编译器不能自动发现这类错误 通常是在程序运行时才能捕捉到时隐时现 无明显症状分类内存分配未成功 却使用了它内存分配成功 但是尚未初始化就引用它内存分配成功 并且已经初始化 但操作越过了内存的边界忘记了释放内存 造成内存泄漏释放了内存 却继续使用它 常见的内存错误及其对策 常见错误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 错在哪里 不能把局部变量的地址作为返回值返回函数返回后 局部变量被释放 该地址的内存会被挪做它用 常见的内存错误及其对策 include includevoidGetInput char p p char malloc 100 程序崩溃 函数不能传递动态分配的内存 voidGetInput char p p char malloc 100 常见的内存错误及其对策 常见错误5解决对策尽量把malloc集中在函数的入口处 free集中在函数的出口处如果free不能放在函数出口处 则指针free后立即设置为NULL不要把局部变量的地址作为返回值返回 因为该内存在函数体结束时被自动销毁指针要么初始化为NULL 要么是其指向合法的内存 非法内存操作 起因内存分配未成功 却使用了它内存分配成功 但是尚未初始化就引用它内存分配成功 并且已经初始化 但操作越过了内存的边界释放了内存 却继续使用它基
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年厨房设备进出口贸易代理协议
- 二零二五年度文化娱乐项目开发合同摘要
- 2025版摩托车售后服务网点加盟协议
- 二零二五年度教育行业贷款购销合同
- 二零二五版智能硬件研发联合出资合作协议
- 2025版便利店连锁加盟品牌推广合作合同
- 二零二五年度房屋买卖合同样本及房地产交易税费减免协议
- 二零二五年度抵押资产购销法律咨询及服务合同
- 2025版股权质押借款跨境投资合作合同
- 2025车库租赁合同范本汇编:车位租赁合同签订指南
- 应急通信网络建设方案
- 八段锦考试题及答案
- DB11-T 806-2022 地面辐射供暖技术规范
- 纯英文初三数学试卷
- 压缩空气流量及管径计算
- 起重吊装作业安全培训题库
- 乐嘉性格色彩培训
- 铝合金技术服务协议
- 员工出差安全培训
- 手术室批量伤员应急预案
- 财险公司新人培训
评论
0/150
提交评论