简介
==========================================================================================
一、new和delete表达式
1、动态创建对象的初始化
动态创建的对象可用初始化变量的方式实现初始化
int i(1024);//i 的值是1024
int *pi=new int(1024);pi所指向的新对象被初始化为1024
string s(10,'9');//s的值是999999999
string *ps=new string(10,'9');*ps =9999999999
如果提供了初值,new 表达式分配到所需要的内存后,用给定的初值初始化该内存空间
2、动态创建对象的默认初始化
如果不提供显示的初始化,动态创建的对象在与函数内定义的变量初始化方式相同。
- 对于类类型的对象,用该类的默认构造函数初始化;
- 内置类型的对象无初始化;
string *ps=new string; //构造了一个新的string对象
int * pi=new int;//没有初始化的一个int 对象
同样也可以对动态创建的对象做值初始化
通过在类型后面使用一对内容为空的圆括号对动态创建的对象做初始化,内容为空的圆括号表示虽然要做初始化,但实际上并未提供特定的初值,
string *ps = new string();//初始化为一个空的string
int * pi=new int();//pi指向一个赋值为0的整型对象
cls *pc = new cls();//pc
int *pi=new int;//没有初始化
int *pi=new int();//有初始化,int 型变量初始化值为0
3、耗尽内存
如果程序用完了所有可用的内存,new表达式就有可能失败。
4、撤销动态创建的对象
动态创建的对象用完后,程序员必须显示地将该对象占用的内存返回给自由存储区。
delete pi;
该命令释放pi指向的int型对象所占用的内存空间。
5、零值指针的删除
如果指针的值为0 ,则在其上做delete 操作是合法的,但是没有意义。
int * ip=0;
delete ip;
6、在delete之后,重设指针的值
delete pi 后,pi变成没有定义,pi不再有效。
删除该指针后,该指针变成悬垂指针。
7、const对象的动态分配和回收
const int *pci= new const int(1024);
与其他常量一样,动态创建的const对象必须在创建时初始化,并且一初始化之后,其值就不能再改!!!
尽管我们不能改变const对象的值,但可以撤销对象本身,如同其他动态对象一样
delete pci;
警告!!!动态内存的管理容易出错
下面三种常见的程序错误都与动态内存分配有关:
- 删除 delete 指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区。删除动态分配内存失败称为“内存泄露”。内存泄露很难发现,一般需要等应用程序运行了一段时间后,耗尽了所有的内存空间时,内存泄露才会显露出来;
- 读写已删除的对象。如果删除指针所指向的对象之后,将指针置为0值,则比较容易检测这类错误;
- 对同一个内存空间使用两次delete表达式,当两个指针指向同一个动态创建的对象,删除时就会发生错误。如果在其中一个指针上做delete运算,将该对象的内存空间返还给自由存储区,然后接着delete第二个指针,此时则自由存储区可能会被破坏。
- 操纵动态分配的内存时,很容易发生上述的错误,但这些错误却难以跟踪和修正。