new和 delete表达式

    系统为每个程序都提供了一个在程序执行时可用的内存池。 这个可用内存池被称为程序 的空闲存储区( 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;

你可能感兴趣的:(delete)