发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走,错误又发作了。 常见的内存错误及其对策如下:

  * 内存分配未成功,却使用了它。

  编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行

  检查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。

  * 内存分配虽然成功,但是尚未初始化就引用它。

  犯这种错误主要有两个起因:一是没有初始化的观念;二是误以为内存的缺省初值全为零,导致引用初值错误(例如数组)。 内存的缺省初值究竟是什么并没有统一的标准,尽管有些时候为零值,我们宁可信其无不可信其有。所以无论用何种方式创建数组,都别忘了赋初值,即便是赋零值也不可省略,不要嫌麻烦。

  * 内存分配成功并且已经初始化,但操作越过了内存的边界。

  例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for循环语句中,循环次数很容易搞错,导致数组操作越界。

  * 忘记了释放内存,造成内存泄露。

  含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,你看不到错误。终有一次程序突然死掉,系统出现提示:内存耗尽。

  动态内存的申请与释放必须配对,程序中malloc与free的使用次数一定要相同,否则肯定有错误(new/delete同理)。

  * 释放了内存却继续使用它。
 
  有三种情况:

  (1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。

  (2)函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。

  (3)使用free或delete释放了内存后,没有将指针设置为NULL。导致产生“野指针”。

注意事项:

  【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。

  【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。

  【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。

  【规则4】动态内存的申请与释放必须配对,防止内存泄漏。

  【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。

C++常见内存错误及解决办法相关推荐

  1. android.mk 编译32位_C/C++初学者常见编译错误及其解决办法

    用户在C/C++集成开发环境(例如 Dev-C++)中编辑了源代码,执行编译之后,常常会因为源代码中存在问题而出现编译错误(它们会显示在编译窗口中).初学者常常会面对这些错误而不知如何处理.本文下面列 ...

  2. Oracle常见ORA错误及解决办法

    Oracle常见ORA错误及解决办法 问题1 1.1 错误现象: EXP-00008: ORACLE error 1013 encountered ORA-01013: user requested ...

  3. lammps教程:常见运行错误及解决办法

    对于lammps新手来说,最怕的可能就是辛辛苦苦编写完代码,上机运行时却发现代码出错. Lammps是全命令行运行方式,对于习惯windows操作的小伙伴来说,界面不是很友好,可能在改错的时候有很多困 ...

  4. C语言常见的错误及解决办法,避坑笔记

    一.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存.浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.结构体成员指针未初始化 struct stud ...

  5. SqlServer 内存篇(五)—— 常见内存错误与解决方法

    内存错误与内存瓶颈不同,当出现内存错误时,轻则某些特殊操作不能完成,重则整个sqlserver无响应,对sqlserver影响通常很大. sqlserver常见的内存错误主要有以下三种: 701 -- ...

  6. android中常见的错误及解决办法

    自己总结的在android中常会出现的不好解决的问题和方法 (其中第三个方法经过了四天的折磨.....哎) 1.报错: BUILD FAILED D:\workspace\ganji\build.xm ...

  7. Android常见内存泄漏以及解决办法

    #1. 注意你的Context引用 ##尝试使用合适的context## (1).Toast能在许多的Activity看到, 使用 getApplicationContext() (2).servic ...

  8. Eclipse 导入 Web 项目时常见的错误及解决办法

    1.The compiler compliance specified is 1.5 but a JRE 1.8 is used 右键点击项目>Properties>Java Compil ...

  9. Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法

    本篇文章主要介绍了Android性能优化之利用LeakCanary检测内存泄漏及解决办法,有兴趣的同学可以了解一下. 目录 前言 什么是内存泄漏? 内存泄漏造成什么影响? 什么是LeakCanary? ...

最新文章

  1. 剑指offer:面试题20. 表示数值的字符串
  2. 【Java】排序算法 之 【快速排序】 总结
  3. oracle10g提权,Oracle 10g提权测试
  4. java 洗牌_java数组之完美洗牌算法
  5. N的倍数(抽屉原理)
  6. 华为汪涛:走向智能世界2030,无线网络未来十年十大产业趋势
  7. mysql慢查询日志分析工具(python写的)
  8. Redis 6.0 源码阅读笔记(9) -- 数据淘汰原理
  9. Scala中的“=”和“-”
  10. AIX系统内存占用率的计算
  11. MSN:常见故障“步步通”(转)
  12. 音频格式怎么转换成mp3格式?
  13. 大二〕一直在寻找 生而为人的意义(转载)
  14. Python爬取校花网
  15. html登陆注册功能实现,实现用户的登录注册功能
  16. 寒假训练第九场 Brocard Point of a Triangle
  17. python百万邮件群发软件_python如何群发邮件
  18. 微信小程序-上传多张图片加进度,持续修正中……
  19. Android 切换系统语言功能实现(下)
  20. 基于鲸鱼优化算法的Simulink仿真模型参数优化

热门文章

  1. spring security运行时配置ignore url
  2. jquery mobile_jQuery Mobile简介
  3. 学生成绩管理系统(三)
  4. 2006年湖北高考作文
  5. linux common comand
  6. 一看就懂的平面设计介绍
  7. 忙里偷闲附上打油诗一首
  8. 使用resilience4j实现优雅重试
  9. 韩顺平 HashSet 课后练习 2
  10. 张亚勤:天才也不会随随便便成功