2007年5月10日星期四

浅谈C语言的内存分配

下面分三个部分介绍C语言的内存分配。一、介绍内存的分配方式。二、介绍内存的分配函数。三、介绍内存分配常见错误及解决办法。
一、在C语言中内存的分配方式有三种:
(1) 从静态存储区域分配。内存在程序编译是就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
(2) 在栈上创建。在执行函数时,函数内部、局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
二、介绍内存的分配函数:
(1) malloc和free
malloc和free一对函数,成对使用。
函数Malloc的原形如下:
void * malloc(size_t size);
由于malloc函数的返回值是void *,所以在调用malloc是要显式的进行类型转换,将void * 转换成所西药的指针类型。
函数free的原型如下:
void free(void * memblock);
(2) new和delete
函数new的使用方法如下:
int *p = new int[length];
为什么new的使用方法这么简单呢?因为new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作。
函数delete的使用方法是 delete [] objects
三、C语言内存分配常见错误及解决办法:
(1) 内存分配未成功,却使用了它。
这种问题是新手最容易犯的错误,因为他们没有意识带内存分配会不成功。长用的解决办法是,在使用内存之前检查指针是否为NULL。
(2) 内存分配成功,但是尚未初始化就引用它。
犯这种错误有两个原因:一是没有初始化的观念;二是以为内存的缺省初值全为零,导致引用初值错误。
内存的缺省初值并没有统一的标准,尽管有些时候为零,但我们不敢说它就是零。所以一定不能忘了赋初值。
(3) 内存分配成功并且已经初始化,但越过了内存的边界
例如:定义一个数组长度为10,但是在佛人循环是不小心循环了11次,就回导致数组越界。
(4) 忘记释放内存,造成内存泄露。
如果犯了这种错误,则函数每被调用一次就丢失一块内存。最终导致系统内存耗尽。还有动态的申请与释放必须配对,否则一定回出错。
(5)释放了内存却继续使用它。有三种情况:
A:程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。
B:函数的return语句写错了,注意不要返回指向栈内存的指针或者引用,因为该内存在函数体结束时被自动销毁。
C:使用free或delete释放了内存后,没有将指针设置为NULL.导致产生野指针。

没有评论: