C/C++小课之指针悬挂

什么是指针悬挂

指针悬挂是一种现象,出现了悬挂指针的现象。

悬挂指针即指向非法内存的指针,也叫野指针。

非法内存指的是我们不能使用的内存,比如我们没有申请过的内存。

1
2
3
int* p = (int*)12345;	//让p存一个随便的地址,这里以12345为例
//int* p; //p未初始化,p的值随机,一般都会指向非法内存
cout << *p; //运行这行代码会出错

随便让p指向一块内存(一般都会指向非法内存)。

运行这段代码时我们使用了非法内存,所以会报错。

一些指针悬挂的情况

课本中有两处提到指针悬挂,分别是:合成拷贝构造函数合成赋值运算符函数

如果类中有指针,这两个函数可能造成指针悬挂。(看完之后想想为什么只是可能?)

代码

下面给出这两种函数造成指针悬挂的代码及注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
class MyClass
{
public:
int * p;

MyClass(){ p = new int;}
~MyClass(){ delete p;}
void print(){ cout << p << endl;}
};

int main()
{
MyClass a;
MyClass b(a); //调用合成拷贝函数
//MyClass b = a; //调用合成赋值运算符
a.print();
b.print(); //据两行输出可知,两个指针指向同一块内存
return 0;
}
//最后,B会先析构,然后A析构。
//B析构会释放p指向的内存,同时这块内存变为非法内存,
//此时A的指针p指向非法内存,造成指针悬挂。
//A析构时delete p,使用了非法内存,这时出错

解决

如果这两个系统合成的函数造成指针悬挂,我们应显式定义(自己定义)这两个函数,并使用深拷贝而非像合成的两个函数一样使用浅拷贝。


作者:@臭咸鱼

转载请注明出处:https://chouxianyu.github.io

欢迎讨论和交流!