一 概述
前面我们说过删除一个指针后一定要将该指针设置为空指针,这是因为删除该指针只会释放它所指向的内存空间,不会删除指针,因此这个指针还存在,并且它任然会指向原来的内存空间,因此这时如果你再次尝试使用该指针,那么将会导致程序出错
二 代码及说明
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
三 总结
- 在删除一个指针后,我们一定要将其赋为空
- 虽然使用空指针是非法的,容易使程序崩溃,但是我们宁愿程序崩溃,也不愿意调试起来很困难