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

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

  编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为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. 玩儿转物联网IoT - 在Beagle Bone Black上运行node.js 程序
  2. python 队列 一次取多个_Queue 队列模块-Python成为专业人士笔记
  3. android开发模式,Android开发中无处不在的设计模式
  4. docker 上关于hyper-v和wsl2的一些要点
  5. Pandas在数据分析中的应用
  6. iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”(转)
  7. [Swift实际操作]七、常见概念-(12)使用DispatchGroup(调度组)管理线程数组
  8. rad linux下安装mysql_Rad Hat Enterprise Linux 5.5上安装Oracle 11g R2
  9. Apache双机热备
  10. 为何区块链能成为金融行业的香饽饽?只因这5个关键因素!
  11. zabbix 监控项自动发现过滤_zabbix怎么使用自动发现添加新监控项
  12. ubuntu下安装flash插件解决视频播放功能
  13. 安装最新版SopCast 0.4.1
  14. HTML5 通过Vedio标签实现视频循环播放
  15. Windows系统中的睡眠时间和关闭屏幕时间的设置
  16. FlashPro2000.C2000.TDS510.TI编程 器支持大部分TI芯片读写2812.28335等
  17. 1635 超大型 LED 显示屏
  18. Unity中的异步编程【1】—— Unity与async 、 await
  19. es中document的主键id及局部更新
  20. app被下架以后多久能上线?重新上架时间汇总

热门文章

  1. 垂直搜索引擎框架(更新中)
  2. 解决Android模拟器卡慢的问题
  3. [附源码]SSM计算机毕业设计二手车交易系统JAVA
  4. ipynb文件转pdf,并支持中文
  5. 企业能否自建物联网卡管理平台
  6. html立方体插件,jquery+css3立方体自定义生成(原创)
  7. sqlserver替换字段第一位数字
  8. 惨遭打出“玲珑塔”,EDG这操作连小学生都笑了!
  9. c++的ThreadPool,OpenHarmony源码实现版赏析和使用
  10. vue 3.0 keep-alive 失效 报错 Cannot read properties of null (reading ‘parentNode‘)