第20章 指针 二 为指针分配和释放空间(2)

2021-09-24 16:41

char* pchar = new char('A');

20.2.3 delete

语法:

delete 指针变量;

白话C++

delete 将释放指定指针所指向的内存空间。

举例:

int* p;

p = new int;

*p = 100;

cout << *p << endl;

delete p;

system("PAUSE");

注意,当一个指针接受delete操作后,它就又成了一个“指向不明”的指针。尽管我们可以猜测它还是指向“原来的房子”,然而,事实上,那座“房子”已经被delete “拆迁”掉了。

20.2.4 实验: new 和 delete

很简单的例子。

第一步:

首先,在CB新建一个控制台程序。然后把上一小节的代码放到main()函数内。运行。结果如下:

(new 和 delete)

按任意键退出后,保存工程(Ctrl + Shift + S)。

第二步:

白话C++

接下来我们来观察指针变量被delete之后,所指向的内存会是什么。但,这是一件犯了C、C++编程大忌的事:访问一个已经delete 的指针的值。如果你最近运气很差,你的CB可能会被强行退出。所以,你明白我们为什么要先存盘了,对不?

在前面的代码中,加入以下加粗加红的一行(同时,你也应注意我的加的注释):

int* p;

p = new int;

*p = 100;

cout << *p << endl;

delete p; //p所指向的内存空间已经被释放

cout << *p << endl; //我们故意去访问此时p所指的内存

system("PAUSE");

运行结果:

(访问delete之后的指针)

44244844??在你的机器可能不是这个数,但一定同样是怪怪的值。原来是好端端的100,现在却成了44244844。不要问我这是为什么?昨天来时,美眉还住在这里一座别致小阁楼里,今日故地重游,这里竟成废墟一片,依稀只见破墙上尚有:“拆!——城建局”的字样?!

new 是管建房的,而 delete就一个字:拆!

白话C++

请大家自行在CB上完成本实验。我没有提供本题的实际工程。20.2.5 new 和 delete 的关系

如果只有“建房”而没有“拆房”,那么程序就会占用内存越来越多。所以,当使用new 为某个指针分配出内存空间后,一定要记得在不需要再使用时,用delete 删除。下面是一个例子。演示new 和 delete 的对应使用。

//建屋和入住:

1) int* p = new int(100);

//使用:

2) cout << *p << endl;

//拆:

3) delete p;

看,第1句,申请了4字节的内存空间,同时存入值为100的整数。

第2句,在屏幕上输出入住者的值 (100)。

第3句,释放内存(这4字节被系统收回准备做其它用途)。入住者呢?自然消失了。

前面举的例子都是在 new 一个 int 类型,其它类型也一样:

char* a = new char('A');

cout << *a << endl;

*a = 'B';

cout << *a << end;

delete a;

bool* b = new bool;

白话C++

*b = true;

if (*b)

cout << "true" << endl;

else

cout << "fale" << endl;

但是这些都是简单数据类型,如果要分配数组一样的连续空间,则需要使另一对武器。

20.3 new [] 和 delete []

new / delete 用于分配和释放单个变量的空间,而 new [] / delete[] 则用于分配连续多个变量的存间。

20.3.1 new[] / delete[] 基本用法

new [] 语法:

指针变量 = new 数据类型[元素个数]

语法实例:

int* p = new int[20];

首先,你需要迅速回想一下,如果是 int* p = new int(20); 那么该是什么作用?否则你很容易在事后把二者混了。

实例中,用 new 申请分配了20个连续的整数所需的空间,即:20 * sizeof(int) = 80个字节。

图示为:

白话C++

(指针变量p指向一段连续的内存空间)

new int 只是分配了一个整数的内存空间,而 new int[N]却分配了N个整数的连续空间。看来,new[] 比 new “威力更猛”,所以,我们同样得记得:用 new [] 分配出空间,当不在需要时,必须及时调用 delete [] 来释放。

delete [] 语法:

delete [] 指针变量;

如:

//分配了可以存放1000个int的连续内存空间:

int* p = new int[1000];

//然后使用这些空间:

……

//最后不需要了,及时释放:

delete [] p;

20.3.2 new []/ delete[] 示例

在 Windows XP 、Windows NT 或 Windows 2000中,按 Ctrl + Alt + Del (其它操作系统,如Windows98/Me等千万不要按些组合键,否则电脑将重启)。可以调出 Windows 任务管理器,其中要以看出当前粗略的的内存使用量。下面我们结合该工具,写一个程序,先分配100M的内存,再释放。

这是程序代码的抓图:

白话C++

各步运行结果: 程序显示

任务管理器抓图

第一步:分配内存之前

(任务管理显示我的机器使用了207兆的内存) 第二步:分配了100兆的内存

(多出了100M) 第三步:又释放出这100兆

(回到207兆)

注意:使用 new 得来的空间,必须用 delete 来释放;使用 new [] 得来的空间,必须用 delete [] 来释放。彼此之间不能混用。

用 new [] 分配出连续空间后,指针变量“指向”该空间的首地址。 20.3.3 详解指向连续空间的指针

在 通过 new [] 指向连续空间以后,p 就变得和一个一维数组很是类似。我们先来复习一下数组相关知识。

假设是这么一个数组:

int arr[20];

则arr 的内存示意图为(为了不太占用版面我缩小了一点):

(数组 arr 的内存示意)

白话C++

和指针变量相比,数组没有一个单独的内存空间而存放其内存地址。即:指针变量p是一个独立的变量,只不过它的值指向另一段连续的内存空间;而数组arr,本身代表的就是一段连续空间。

如果拿房间来比喻。指针和数组都是存放地址。只不过,指针是你口袋里的那本通讯录上写着的地址,你可以随时改变它的内容,甚至擦除。而数组是你家门楣上钉着的地址,你家原来是“复兴路甲108号”,你绝对不能趁月黑天高,把它涂改为“唐宁街10号”。

第20章 指针 二 为指针分配和释放空间(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:巴以冲突的历史由来

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: