您的位置:首页 > 其它

new和 delete表达式

2010-12-12 15:30 357 查看
系统为每个程序都提供了一个在程序执行时可用的内存池。 这个可用内存池被称为程序 的空闲存储区( free store) 或堆 (heap), 运行时刻的内存分配被称为动态内存分配(dynamic memory allocation)。

动态内存分配由 new 表达式应用在一个类型指示符 specifier 上来完成,类型指示符可以是内置类型或用户定义类型,new 表达式返回指向新分配的对象的指针 。

例如
int *pi = new int;

从空闲存储区中分配了一个int型的对象,并用它的地址初始化 pi, 在空闲存储区内实际分配的对象并没有被初始化, 我们可以如下指定一个初始值 :
int *pi = new int( 1024 );
它不但分配了这个对象而且用1024 将其初始化。

要动态分配一个对象数组,我们可以写成:
int *pia = new int[ 10 ];

数组的元素没有被初始化,没有语法能为动态分配的数组的元素指定一个显式的初始值集 合, 在类对象数组的情况下 如果我们定义了缺省构造函数,那么它将被顺次应用在数组的每一个元素上,例如 :
string *ps = new string;
从空闲存储区分配了一个string类对象 并用它的地址初始化 ps 然后再在该对象上调用 string类缺省构造函数;

类似地 ,如下语句 :
string *psa = new string[ 10 ];
从空闲存储区分配了一个含有10个 string 类对象的数组,用它的地址初始化psa 然后依次在每个元素上调用string 类的缺省构造函数 。

当对象完成了使命时 我们必须显式地把对象的内存返还给空闲存储区 我们通过把delete 表达式应用在 指向我们用 new 表达式分配的对象指针上来做到这一点(delete 表达式不应该被应用在不是通过 new 表达式分配的指针上,delete也不能用于指向栈stack空间的指针上,例如:int a =1; int *p = new int; p=&a;delete p; //错误,此时p指向了a所在的stack的a),例如 :
delete pi;
释放了pi指向的int对象,将其返还给空闲存储区,类似地
delete ps;
在 ps 指向的 string类对象上应用 string 的析构函数后,释放其存储区并将其返还给空
闲存储区,最后
delete [] pia;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: