new & delete

版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 4.0

动态创建对象的初始化

1
2
3
4
int i(1024);
int *ip = new int (1024); //*ip = 1024
string s(10, '9'); //s = "9999999999"
string *sp = new string(10, '9'); //*sp = "9999999999"

动态创建对象的默认初始化

1
2
string *sp = new string;	//空string
int *ip = new int; //未初始化

可以利用下列方式进行默认初始化

1
2
string *sp = new string();	//空string
int *ip = new int(); //0

撤销动态创建对象

1
2
3
4
5
6
7
8
9
10
int i;
int *ip = &i;
string s("str");
double *dp = new double(3.14);
int *ip0 = 0;

delete s; //error: s是非动态对象
delete ip; //error: ip指向本地对象
delete dp; //ok
delete ip0; //ok: 但没什么意义

C++未明确定义如何释放非new分配的内存地址。

delete后重设指针的值

执行delete语句后,尽管指针变成未定义,但仍存放了之前所指对象的地址,称为 悬挂指针(dangling pointer) 。这种指针往往容易出错。

一旦delete指针,立即将其置为0,就可以避免悬挂指针。

const对象的动态分配和回收

1
const int *cip = new const int(1024);	//必须初始化,且不能再修改

如果有默认构造函数,则可以隐式初始化,如

1
const string *csp = new const string;

尽管不能改变const对象的值,但可撤销对象本身

1
2
delete cip;	//ok
cip = 0;

END.