Posted on 2012-07-08 14:51
linzheng 阅读(532)
评论(0) 编辑 收藏 引用
在C++ 中,对象可以静态分配—— 即编译器在处理程序源代码时分配,也可以动态分配—— 即程序执行时调用运行时刻库函数来分配。这两种内存分配方法的主要区别是效率与灵活性之间的平衡准则不同。出于静态内存分配是在程序执行之前进行的,因而效率比较高,但是,它缺少灵活性,它要求在程序执行之前就知道所需内存的类型和数量,例如,利用静态分配的字符串数组,我们无法很容易地处理和存储任意的文本文件。一般来说,存储未知数目的元素需要动态内存分配的灵活性。
到目前为止,所有的内存分配都是静态的 例如 int ival = 1024; 则是在程序编译的时候就已经分配好空间了。
怎样访问和存储内存地址呢?
C++ 支持用指针类型来存放对象的内存地址值,例如为了声明一个能存放ival 内存地址的指针类型,我们可以这样写:
// 一个指向int 类型的指针
int *pint;
C++ 预定义了一个专门的取地址操作符&,当我们把它应用在一个对象上时返回的是对象的地址值。因此为了将ival 内存地址值赋给pint 我们可以这样写:
int *pint;
pint = &ival; // 把ival 的地址pint
了访问pint 所指向的实际对象,我们必须先用解引用操作符* 来解除pint 的引用pint。例如下面我们通过pint 间接地给ival 加1
// 通过pint 间接地给ival 加1
*pint = *pint + 1;
它等价于下面直接对ival 操作的语句
// 直接给ival 加1
ival = ival + 1;
在本例中使用指针间接地操作ival,没有什么实际的好处这样做比直接操作ival 的效率要低,而且又容易出错。我们只是用它来简单地介绍一下指针在C++ 中指针的主要用处是管理和操纵动态分配的内存。
静态与动态内存分配的两个主要区别是
1. 静态对象是有名字的变量,我们直接对其进行操作,而动态对象是没有名字的变量,我们通过指针间接地对它进行操作。
2. 静态对象的分配与释放由编译器自动处理,程序员需要理解这一点但不需要做任何事情。相反动态对象的分配与释放必须由程序员显式地管理,相对来说比较容易出错,它通过new 和delete 两个表达式来完成。
对象的动态分配的两种方式:
第一种:int *pint = new int( 1024 );
分配了一个没有名字的int 类型的对象对象初始值为1024,然后表达式返回对象在内存中的地址,接着这个地址被用来初始化指针对象pint。对于动态分配的内存惟一的访问方式是通过指针间接地访问。
第二种:int *pia = new int[ 4 ];
分配了一个含有四个整数元素的数组。
当用完了动态分配的对象或对象的数组时,我们必须显式地释放这些内存。我们可以通过使用delete 表达式来完成这件事情。而释放之后的内存则可以被程序重新使用。
单一对象的delete 表达式形式如下
// 删除单个对象
delete pint;
数组形式的delete 表达式如下
// 删除一个对象数组
delete [] pia;
如果忘了删除动态分配的内存又会怎么样呢?如果真的如此程序就会在结束时出现内存泄漏的问题。