CPP学习之——指针的常见错误(8.17)

一 概述

前面我们说过删除一个指针后一定要将该指针设置为空指针,这是因为删除该指针只会释放它所指向的内存空间,不会删除指针,因此这个指针还存在,并且它任然会指向原来的内存空间,因此这时如果你再次尝试使用该指针,那么将会导致程序出错

二 代码及说明

2.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
using namespace std;
int main() {

int *p = new int;
*p = 3;
cout << "将3赋给p的地址后,指针p读取的值:\t" << *p << endl;
delete p;
//p=0;
cout << "删除空间后,指针p读取的值:\t\t" << *p << endl;
long *p1 = new long;
cout << "创建新空间后,指针p中保存的地址: \t" << p << endl;
*p1 = 999;
cout << "指向新空间的指针p1保存的地址:\t\t" << p1 << endl;
*p = 23;
cout << "将23赋给p的地址后,指针p读取的地址:\t" << *p << endl;
cout << "将23赋给p的地址后,指针p1读取的地址:\t" << *p1 << endl;
delete p1;
return 0;
}

2.2 输出

1
2
3
4
5
6
将3赋给p的地址后,指针p读取的值:	3
删除空间后,指针p读取的值: 7634384
创建新空间后,指针p中保存的地址: 0x5e7dc0
指向新空间的指针p1保存的地址: 0x5e7dc0
将23赋给p的地址后,指针p读取的地址: 23
将23赋给p的地址后,指针p1读取的地址: 23

2.3 说明

  • 删除指针后,p就成了一个迷途指针,这时因为在对p指针使用关键字delete时,等于告诉编译器可以用该内存区域保存其他数据,因此随机数7634384被保存在了该区域
  • 由于编译器会默认将释放掉的内存空间回收,然后分配给新开辟的空间,因此新定义的指向新开辟的long型变量空间的指针p1,这个p1其实指向的是释放掉的空间,也就是p所指向的空间,为了证实这一点,我们分别输出了p和p1指针变量中保存的内存地址,结果是一样的
  • 由于这两个指针都指向一块内存,其实是将23赋给了p1所指向的内存空间,p和p1指针读取内存空间的值,输出的结果都是23

三 总结

  • 在删除一个指针后,我们一定要将其赋为空
  • 虽然使用空指针是非法的,容易使程序崩溃,但是我们宁愿程序崩溃,也不愿意调试起来很困难