设为首页 加入收藏

TOP

c++ new 和 delete
2015-11-21 00:59:40 来源: 作者: 【 】 浏览:2
Tags:new delete

一. 用new和delete创建和释放单个对象

动态创建对象时,只需要指定其数据类型, 而不必为该对象命名. new 表达式返回指向新创建对象的指针, 通过指针来访问此对象.

?

int *pi = new int;
这个new表达式在自由存储区中分配创建了一个整型对象, 并返回此对象的地址, 并用该地址初始化指针pi.

?

?

1.动态创建对象的初始化

动态创建的对象可用初始化变量的方式实现初始化.

?

int *pi = new int (1024) ;

string *ps = new string(10, '9');

?

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

如果不提供显示初始化, 对于类类型的对象, 用该类的默认构造函数初始化;而内置类型的对象则无初始化.

?

string *ps = new string() ; 
string *ps= new string ;
对于类类型, 例如上面的string类型, 两个语句是一样的, 都是初始化为空字符串.

?

而对于内置类型, 如

?

int *pi = new int;
int *pi = new int();
不初始化和提供显示初始化的结果有显著的差别.

?

第一个语句pi指向一个未初始化的int类型, 而第二个语句pi指向一个初始化为0的int类型.

?

3.耗尽内存

如果程序用完了所有可用的内存, new表达式就有可能失败. 如果new表达式无法获取想要的内存空间, 系统将抛出名为bad_alloc的异常.

?

4.撤销动态创建的对象

动态创建的对象用完后, 程序员必须显式地将该对象占用的内存返回给自由存储区. c++提供delete表达式释放指针所指向的地址空间.如果指针指向的不是用new分配的内存地址, 则在该指针上使用delete是不合法的.

delete pi;

?

5.在delete后,重设指针的值

执行语句 delete pi;后, pi编成了不确定的指针, 它仍然存放了它之前所指向对象的地址, 然而pi所指的内存已经被释放, 因此p不再有效.

删除指针后, 该指针变成悬挂指针. 悬挂指针指向曾经存放对象的内存, 但该对象已经不存在了. 悬挂指针往往导致程序错误, 而且很难检测出来.

一旦删除了指针所指向的对象, 立即将指针置为0, 这样就非常清楚地表明指针不再指向任何对象.



?

?

?

二. 创建动态数组

1.动态数组的定义

数组变量通过指定类型, 数组名和维数来定义. 而动态分配数组时, 只需指定类型和数组长度, 不必为数组对象命名, new表达式返回指向新分配数组的第一个元素的指针:

int *pia = new int[10];

此new表达式分配了一个含有10个int型元素的数组, 并返回指向该数组第一个元素的指针, 此返回值初始化了指针pia.

new表达式需要指定指针类型以及在括号中给出的数组维数, 该维数可以是任意的复杂表达式.

2.初始化动态分配的数组

类类型: 使用该类的默认构造函数初始化.

内置类型: 无初始化

string *psa = new string[10]; //一个含有10个空字符串的数组

int *pia= new int[10]; 含有10个未初始化int的数组

也可以使用跟在数组长度后面的一对空括号, 对数组元素做值初始化.

int *pia2 = new int[10] ();

上述表达式把数组元素都设置为0.

对于动态分配的数组, 其元素只能初始化为元素类型的默认值, 而不能像数组变量一样 , 用初始化列表为数组元素提供各不相同的初值.

?

4.允许动态分配空数组

char *cp = new char[0];

用new动态创建长度为0的数组时, new返回有效的非零指针. 该指针与new返回的其他指针不同, 不能进行解引用操作, 因为毕竟它没有指向任何元素.

?

5.动态空间的释放

delete [] pia;

该语句回收了pia所指向的数组, 把相应的内存返还给自由存储区. 记得要有[] , 否则会导致少释放了内存空间, 导致内存泄漏.

?

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇NOJ1167 丑陋数 想法题 下一篇HDU3572Task Schedule(最大流 ISA..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: