CPP学习之——用指针删除堆中空间(8.9.5)

一 概述

由于使用new创建的内存空间不会被系统自动释放,因此假如你不去释放它,那么该区域的内存将始终不能为其他数据所使用,而指向该内存的指针是个局部变量,当定义该指针的函数结束并返回时,指针也就消失了,那么我们就再也找不到该块内存区域,就像重拨键中记录的号码一行,假如重拨键中的号码自动消失了,那么我们将再也访问不到安徽出版社了。

同样的道理,假如指向该内存区域的指针自动消失了,计算机就再也找不到该区域的内存了,就好像是丢失了这块内存一样,我们把这种情况叫做内存泄漏。

这种糟糕的情况将一直持续到程序结束,该区域的内存才能恢复使用。因此,假如你不需要一块内存空间,那么就必须对指向它的指针使用关键字delete

二 代码及输出结果

2.1 示例一

2.1.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
using namespace std;
int main()
{
int *p=new int;
delete p;
p=new int;
delete p;
//p=0;
delete p;
delete p;
return 0;
}

2.1.2 结果

1
程序异常

2.1.3 原因分析

  • 因为p所指向的内存区域已经被释放,如果再进行释放,将会使程序崩溃
  • 不过,假如我们将该指针赋为0的话,那么删除一个空指针将是安全的

2.2 示例二

2.2.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
using namespace std;
int main()
{
int *p = new int;
*p = 3600;
cout << *p << endl;
delete p;
cout << *p << endl;
p = 0;
p = new int;
*p = 8;
cout << *p << endl;
delete p;
return 0;

}

2.2.2 输出结果

1
2
3
3600
6913712
8