系统为每个程序都提供了一个在程序执行时可用的内存池.这个可用内存池被称为程序的空闲存储区(free store)
或堆(heap).运行时刻的内存分配被称为动态内存分配(dynamic memory allocation).正如我们在第1
章中所看到的,动态内存分配由new 表达式应用在一个类型指示符(specifier) 上来完成,类型指示符可以是内置类型或用户定义类型.new
表达式返回指向新分配的对象的指针.例如:
int *pi = new int;
从空闲存储区中分配了一个int 型的对象,并用它的地址初始化pi.在空闲存储区内实际分配的对象并没有被初始化.
我们可以如下指定一个初始值:
int *pi = new int( 1024 );
它不但分配了这个对象而且用1024 将其初始化.
要动态分配一个对象数组我们可以写成:
int *pia = new int[ 10 ];
它从空闲存储区中分配了一个数组,其中含有10 个int 型对象,并用它的地址初始化pin,而数组的元素没有被初始化.
没有语法能为动态分配的数组的元素指定一个显式的初始值集合.(在类对象数组的情况下如果我们定义了缺省构造函数那么它将被顺次应用在数组的每一个元素上.)例如:
string *ps = new string;
从空闲存储区分配了一个string 类对象,并用它的地址初始化ps,然后再在该对象上调用string 类缺省构造函数.类似地,如下语句:
string *psa = new string[ 10 ];
从空闲存储区分配了一个含有10 个string 类对象的数组,用它的地址初始化psa, 然后依次在每个元素上调用string 类的缺省构造函数.
所有从空闲存储区分配的对象都是未命名的,这是它的另一个特点.new 表达式并不返回实际被分配的对象,而且返回这个对象的地址.对象的所有操作都通过这个地址间接来完成.
当对象完成了使命时,我们必须显式地把对象的内存返还给空闲存储区.我们通过把delete 表达式应用在"指向我们用new 表达式分配的对象指针"上来做到这一点(delete 表达式不应该被应用"在不是通过new 表达式分配的指针"上).例如:
delete pi;
释放了pi 指向的int 对象,将其返还给空闲存储区.类似地:
delete ps;
在ps 指向的string 类对象上应用string 的析构函数后,释放其存储区,并将其返还给空闲存储区.最后:
delete [] pia;
释放了pia 指向的10 个int 对象的数组,并把相关的内存区返还给空闲存储区,在关键字delete 与指针之间的空方括号表示delete 的一种特殊语法,它释放由new 表达式分配的数组的存储区.
阅读(1330) | 评论(0) | 转发(0) |