C++常见内存错误及解决办法
发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走,错误又发作了。 常见的内存错误及其对策如下:
* 内存分配未成功,却使用了它。
编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为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++常见内存错误及解决办法相关推荐
- android.mk 编译32位_C/C++初学者常见编译错误及其解决办法
用户在C/C++集成开发环境(例如 Dev-C++)中编辑了源代码,执行编译之后,常常会因为源代码中存在问题而出现编译错误(它们会显示在编译窗口中).初学者常常会面对这些错误而不知如何处理.本文下面列 ...
- Oracle常见ORA错误及解决办法
Oracle常见ORA错误及解决办法 问题1 1.1 错误现象: EXP-00008: ORACLE error 1013 encountered ORA-01013: user requested ...
- lammps教程:常见运行错误及解决办法
对于lammps新手来说,最怕的可能就是辛辛苦苦编写完代码,上机运行时却发现代码出错. Lammps是全命令行运行方式,对于习惯windows操作的小伙伴来说,界面不是很友好,可能在改错的时候有很多困 ...
- C语言常见的错误及解决办法,避坑笔记
一.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存.浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.结构体成员指针未初始化 struct stud ...
- SqlServer 内存篇(五)—— 常见内存错误与解决方法
内存错误与内存瓶颈不同,当出现内存错误时,轻则某些特殊操作不能完成,重则整个sqlserver无响应,对sqlserver影响通常很大. sqlserver常见的内存错误主要有以下三种: 701 -- ...
- android中常见的错误及解决办法
自己总结的在android中常会出现的不好解决的问题和方法 (其中第三个方法经过了四天的折磨.....哎) 1.报错: BUILD FAILED D:\workspace\ganji\build.xm ...
- Android常见内存泄漏以及解决办法
#1. 注意你的Context引用 ##尝试使用合适的context## (1).Toast能在许多的Activity看到, 使用 getApplicationContext() (2).servic ...
- Eclipse 导入 Web 项目时常见的错误及解决办法
1.The compiler compliance specified is 1.5 but a JRE 1.8 is used 右键点击项目>Properties>Java Compil ...
- Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法
本篇文章主要介绍了Android性能优化之利用LeakCanary检测内存泄漏及解决办法,有兴趣的同学可以了解一下. 目录 前言 什么是内存泄漏? 内存泄漏造成什么影响? 什么是LeakCanary? ...
最新文章
- 剑指offer:面试题20. 表示数值的字符串
- 【Java】排序算法 之 【快速排序】 总结
- oracle10g提权,Oracle 10g提权测试
- java 洗牌_java数组之完美洗牌算法
- N的倍数(抽屉原理)
- 华为汪涛:走向智能世界2030,无线网络未来十年十大产业趋势
- mysql慢查询日志分析工具(python写的)
- Redis 6.0 源码阅读笔记(9) -- 数据淘汰原理
- Scala中的“=”和“-”
- AIX系统内存占用率的计算
- MSN:常见故障“步步通”(转)
- 音频格式怎么转换成mp3格式?
- 大二〕一直在寻找 生而为人的意义(转载)
- Python爬取校花网
- html登陆注册功能实现,实现用户的登录注册功能
- 寒假训练第九场 Brocard Point of a Triangle
- python百万邮件群发软件_python如何群发邮件
- 微信小程序-上传多张图片加进度,持续修正中……
- Android 切换系统语言功能实现(下)
- 基于鲸鱼优化算法的Simulink仿真模型参数优化