常见的内存错误及其对策

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

编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,

在使用内存之前检查指针是否为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。导致产生“野指针”

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

防止使用指针值为NULL 的内存。

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

值使用。

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

操作。

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

【规则7-2-5】用free 或delete 释放了内存之后,立即将指针设置为NULL,防止

产生“野指针”。

时间: 2024-10-23 22:50:09

常见的内存错误及其对策的相关文章

C语言中常见的内存错误与解决方法

常见的错误 关于内存的一些知识已在内存分配中提及,现记录与分享常见的内存错误与对策. 类型 1:内存未分配成功,却使用了它. 方   法:在使用之前检查指针是否为NULL. 1)当指针p是函数的参数时,在函数入口处用语句assert(p!=NULL)进行断言检查. 2)当使用malloc或new来申请内存时,应该用if(p != NULL)进行防错检查. 类型 2:引用了尚未初始化的指针 原   因:内存的缺省初始值究竟是什么并没有统一的标准,在使用之前都进行初始化. 1)没有初始化的观念. 2

常见动态内存错误---内存泄漏

常见动态内存错误 编译器不能自动发现动态内存错误,动态内存错误通常只能在程序运行时才能被捕捉到,而且错误原因不容易查找,错误本身也不容易捕捉,改错难度较大. 1.动态内存分配失败却继续操作 内存不足等有可能导致动态内存分配失败,所以使用new请求分配动态内存后一定要检查返回地址是否为NULL. 如用if(p==NULL) 或 if(p!=NULL)进行检查,未检查前不要操作动态内存空间. 2.动态内存空间未初始化就进行读操作 C++标准并未规定动态内存空间的默认值,程序无法预知该默认值的具体指.

常见的C语言内存错误及对策(转)

http://see.xidian.edu.cn/cpp/html/483.html 一.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存.浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.结构体成员指针未初始化 struct student {    char *name;    int score; }stu,*pstu; intmain() {    strcpy(stu.name,"Jimy");    stu.score =

C语言常见内存错误

C语言指针和内存泄露 常见的内存错误: 1.      内存分配未成功却使用了它. 如果指针p是函数的参数,要在函数的入口处用assert(p!=NULL)进行检查: 如果是用malloc来动态申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理. 2.      内存分配成功,尚未初始化就使用它. 3.      内存分配成功并且初始化,但操作越界. 例如在使用数组时经常发生"多1"或"少1"操作. 4.      忘记释放内存造成内存泄露.

大内高手—常见内存错误

转自:http://blog.chinaunix.net/uid-23228758-id-4355524.html 随着诸如代码重构和单元测试等方法引入实践,调试技能渐渐弱化了,甚至有人主张废除调试器.这是有道理的,原因在于调试的代价往往太大了,特别是调试系统集成之后的BUG,一个BUG花了几天甚至数周时间并非罕见. 而这些难以定位的BUG基本上可以归为两类:内存错误和并发问题.而又以内存错误最为普遍,即使是久经沙场的老手,也有时也难免落入陷阱.前事不忘,后世之师,了解这些常见的错误,在编程时就

【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的.因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才表现出来.前几天线上模块因堆内存写越界1个字节引起各种诡异崩溃,定位问题过程中的折腾仍历历在目,今天读到<深入理解计算机系统>第9章-虚拟存储器,发现书中总结了C程序中常见的内存操作有

常见内存错误的几点总结

学习C语言以来一直没有注意到细节的控制,敲代码总是"无所顾忌"的.如今慢慢把程序写大写复杂了.在资源宝贵和的嵌入式中.这个问题越来越须要注意了--内存的管理..让编程慢慢走上正轨,慢慢走上可预见性吧,慢慢与机器融为一体,慢慢习惯于如梁肇新前辈所说以机器的思维方式思维吧!!! 1.返回局部变量地址将引起内存错误 2.暂时空间过大:操作系统在载入某个应用程序时,都将为其分配一定大小的栈空间,若申请过大的局部变量.可能会引起栈溢出问题. (PC机上Windows和Linux系统一般不必操心这

C程序中常见的内存操作错误

对C/C++程序员来说,管理和使用虚拟存储器可能是个困难的, 容易出错的任务.与存储器有关的错误属于那些令人惊恐的错误, 因为它们在时间和空间上, 经常是在距错误源一段距离之后才表现出来. 将错误的数据写到错误的位置, 你的程序可能在最终失败之前运行了好几个小时,且使程序中止的位置距离错误的位置已经很远啦.而避免这种噩梦的最好方法就是防范于未然. 幸好<深入理解计算机系统>中有一段讲: C程序中常见的内存操作有关的10种典型编程错误,十分经典, 因此抄写在此, 以便以后随时查看,复习. 把优秀

iOS开发 两个内存错误的一般处理方法

本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101dxlj.html 由于iOS5.0之前没有自动应用计数机制,也没有Java那样的垃圾回收功能.我们都需要自己管理和控制对象的回收,这是一件很麻烦的事情,也是做iOS项目中最容易出现的问题.如果不掌握这些方法,调试这些问题几乎没有头绪. 1.EXC_BAD_ACCESS内存错误与NSZombieEnabledEXC_BAD_ACCESS是最常见的错误了,这个一般是访问了释放了的内存地址空间造成的.比