`
sam406
  • 浏览: 58101 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

类存分配方法

阅读更多
1、内存分配方式

内存分配方式有三种:
[color=green]
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

2、常见的内存错误及其对策

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

常见的内存错误及其对策如下:

内存分配未成功,却使用了它。
编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为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,防止产生“野指针”。
分享到:
评论

相关推荐

    基于Linux网络服务器的内存分配方法研究.pdf

    基于Linux网络服务器的内存分配方法研究.pdf

    操作系统实验 实验二 Windows虚拟存储器管理

    操作系统实验 实验二 Windows虚拟存储器管理 2.1实验目的 了解Windows 2000/XP的内存管理机制,掌握页式...理解内存分配原理,特别是以页面为单位的虚拟内存分配方法 掌握Windows 2000/XP下内存管理的基本API ......

    虚拟存储器管理——模拟内存分配与回收实验算法(c语言)

    理解内存分配原理,特别是以页面为单位的虚拟内存分配方法。模拟存储管理中内存空间的管理和分配内存空间的管理分为固定分区管理方式,可变分区管理方式,页式存储管理,段式存储管理。

    基于Linux网络服务器的内存分配方法研究 (2013年)

    笔者在开发一款基于Unux的网络服务器时,被要求设计一种高效的、并且碎片率很低的内存分配方法。为此,先对当前流行的动态存储管理方法进行了研究分析,这些方法由于各种各样的原因,不能直接应用于Linux网络服务器中。...

    linux内存分配方法

    绍linux的内存分配方法。

    动态内存分配算法实验报告

    动态内存分配算法实验报告包括:实验题目,实验目的,实验要求,实验内容,实验结果,实验总结及后附有详细源代码 实验内容 1,确定定内存空闲分配表和进程内存分配表 2,采用首次适应算法完成内存空间的分配 3,...

    操作系统内存管理

    基于linux上的操作系统内存管理的讲义,我们学校的可以参考一下

    java中内存分配

    "java中内存分配" Java 中的内存分配是 Java 程序员必须掌握的重要知识。JAVA 中内存分配的问题是指 Java 程序在运行时如何在内存中存储数据的过程。Java 程序运行时有 6 个地方可以存储数据,它们分别是寄存器、栈...

    明晰C 内存分配的五种方法的区别

    明晰C 内存分配的五种方法的区别

    嵌入式系统的内存分配

    实时性、可靠性的要求,使得许多嵌入式应用使用自己的内存管理程序。本文探讨嵌入式 系统中对内存管理的要求、存在的问题以及可能的解决策略;介绍一种“一次分配,多...使用” 的动态内存分配方法, 并给出2 个例子。

    采用最坏适应算法进行内存分配回收

    编写程序模拟实现内存的动态分区法存储管理。内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时假定不做与相邻空闲区的合并。

    C语言的链表基本操作

    动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于景泰内存分配的特点...

    内存分配与变量定义方法

    内存分配与变量定义方法

    计算机操作系统内存分配与回收算法

    内存分配与回收算法实现 1、实验目的 掌握为实现多道程序并发执行,操作系统是如何通过作业调度选择作业进入内存 系统如何为进入内存的作业分配内存空间,实现多道作业同时驻留内存,就绪进程队列中的多个进程是如何...

    用new和delete运算符动态分配内存空间的方法编写程序。

    用new和delete运算符动态分配内存空间的方法编写程序。从键盘输入33整型数组的数据,并计算出所有元素之和,打印出最大值和最小值。输入输出要用流运算符实现。

    JAVA内存分配

    JAVA内存分配原理 Java 程序运行时的内存结构分成:方法区、栈内存、堆内存、本地方法栈几种。

    C++动态内存分配.ppt

    本章首先介绍程序运行时动态内存分配(dynamic memory allocation)的概念与方法。到目前为止,本教材介绍的程序设计中,变量和对象在内存中的分配都是编译器在编译程序时安排好了的,这带来了极大的不便,如数组...

    嵌入式系统/ARM技术中的嵌入式系统中对内存分配

    介绍一种“一次分配,多次使用”的动态内存分配方法,并给出2个例子。 关键词:嵌入式系统 内存管理 一次分配多次使用 1 嵌入式系统中对内存分配的要求  ①快速性。嵌入式系统中对实时性的保证,要求内存分配...

    动态分区存储管理 最佳适应算法 内存分配和回收

    操作系统实验,动态分区存储管理,使用最佳适应算法,内存的分配和回收

    深入讲解动态内存分配

    介绍程序运行时动态内存分配(dynamic memory allocation)的概念与方法并进一步讨论拷贝构造函数; 还要学习更多有关数据结构的基本知识,包括栈。队,二叉树等的基本算法和应用。模板是标准C++实现代码复用的有力...

Global site tag (gtag.js) - Google Analytics