您的位置:首页 > 编程语言 > C语言/C++

C++的new和delete表达式

2014-05-18 19:59 309 查看
定义变量时,必须指定其数据类型和名字,而创建动态对象时只需要指定其数据类型,而不必为该对象命名

int i;

int *pi=new int;

这个new表达式在自由存储区中分配创建了一个整形对象,并返回次兑现光额地址,并用改地址初始化Pi;

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

int i(2024);

int *pi=new int(2024);

string s(10,'9');

string s=new string(10,‘9’);

2.动态数组的默认初始化

如果不显示的初始化,动态创建的对象与在函数内定义的变量初始化的方式相同。类类型就用自己默认的构造函数初始化,而内置类型如果不显示的初始化那就没有初始化,所以,内置类型一般显示的初始化。

如int*pi=new int();//初始化为0

3.撤销动态创建对象

C++提供了delete表达式释放指针所指向的内存空间。

delete pi;

该指令释放了指针pi指向的int行对象所占用的内存空间。

如果指针指向的不是new分配的内存地址,则该指针傻姑娘使用delete是不合法的。

4.在delete之后重设指针的值

执行语句;

delete pi;

后,pi变成不确定的指针。在很多机器上,尽管pi值没有明确的定义,但仍然存放了他之前所指向对象的地址,然而pi所指向的内存已经释放,因此pi不在有效。

删除指针后,该指针变为悬垂指针。悬垂指针指向曾经存放对象的内存,但是该对象已经不复存在了。悬垂指针往往导致编译错误,而且很难检测出来。

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

警告:

常见的三种程序错误都与动态内存分配有关;

(1)删除delete指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区。删除动态内存失败称为内存泄露。

(2)读写已经删除了的对象。将删除指针所指向的对象之后将指针设置为0则比较容易检测出此类问题。

(3)对同一内存块使用两次delete表达式。当两个指针指向同一个动态创建的对象删除时就会发生错误。如果在其中一个指针上做delete运算,将该对象的内存空间返还给自由存储区,然后接着delete第二个指针,此时自由存储区就有可能被破坏。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: