new和delete表达式动态创建和释放单个对象
a) 基本知识介绍:定义变量时,必须指定其数据类型和名字。而动态创建对象时只需指定其数据类型而不必为该对象命名。取而代之的是,new表达式返回新创建对象的指针,我们通过指针来访问此对象:
int i;//命名的但未初始化的变量
int *pi = new int;//pi指向一个动态分配的未命名,未初始化的变量
b) 简单代码演示:
a) 动态创建对象的初始化
int i(1024);//i=1024
int *pi = new int(1024);//pi指向的对象的值是1024
string s(10,’9’);//十个9的字符串
string *ps = new string(10,’9’);//*ps为十个9的字符串
b) 动态创建对象的默认初始化
如果不提供显示的初始化,对于类类型的对象,用该类的默认构造函数进行初始化;而内置类型的对象则无初始化
string *ps = new string//初始化为一个空字符串
int *pi = new int //pi指向一个未初始化的整型
()是值初始化的语法
int *pi = new int();//pi表示指向一个值为0的整数
c) 撤销动态创建对象
动态创建的对象用完之后,必须显示地将该对象占用的内存返回给自由存储区。
delete pi;
上面的命令释放pi指向的int型对象所占用的内存空间。
注意:如果指针指向的不是new分配的内存地址,则在该指针上使用delete是不合法的。具体举例如下:
int i;
int *pi = &i;
string str = “yanlei”;
double *pd = new double(33);
delete str;//error:str不是一个动态对象
delete pi;//error:pi指向的是一个本地变量
delete pd;//ok
c) 小常识:C++中不允许定义长度为0的数组,释放动态数组空间的正确语法语句为:
若定义为:int *pia = new int[10]
则释放空间的语句为:delete[] pia;
理论上,回收数组时缺少方括号对,至少会导致运行时少释放了内存空间,从而产生内存泄露。