关于悬垂指针

0.悬垂指针的定义


当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称悬垂指针(也叫迷途指针)。

某些编程语言允许未初始化的指针的存在,而这类指针即为野指针。

1.悬垂指针出现的具体情境:


#include <iostream>
#include <stddef.h>
using namespace std;
struct Node
{
    int value;
    Node* next;
};
void test();
int main()
{
    test();
}
void test()
{
    Node* a = new Node;
    cout<<"a的地址:"<<a<<endl;
    Node* b = new Node;
    cout<<"b的地址:"<<b<<endl;
    Node* c;
    a->next = b;
    a->value = 5;
    cout<<"a->next所指"<<a->next<<endl;
    c = a;
    cout<<"c的地址:"<<c<<endl;
    c->next = NULL;
    cout<<"a->next所指"<<a->next<<endl;
    delete c;cout<<"已delete掉*a和*c所指的由new分配的内存块--"<<endl;
    cout<<"c的地址:"<<c<<endl;
    cout<<"a的地址:"<<a<<endl;
    cout<<"a->next所指"<<a->next<<endl;
    cout<<"b的地址:"<<b;
    cout<<"a->value:"<<a->value<<endl;
    a->value = 6;
    cout<<"a->value:"<<a->value<<endl;
}

以下为程序运行结果(g++):

a的地址:0x600000420
b的地址:0x6000128a0
a->next所指0x6000128a0
c的地址:0x600000420
a->next所指0
已delete掉*a和*c所指的由new分配的内存块--
c的地址:0x600000420
a的地址:0x600000420
a->next所指0x1802e5f28
b的地址:0x6000128a0a->value:-2144444632
a->value:6

该程序简单用一副思维导图表示:

也就是说 :

  • 将指针变量a指向 用new分配的结构体内存块,并将其字段赋值;

  • 将指针变量b指向 另一个用new分配的结构体内存块;

  • 之后将未初始化的指针变量c指向a所指的内存块,将其字段的*next指针设成NULL;

  • 再delete掉c所指的内存块

发现:
* c和a所指的内存块即使已经被delete掉了,但是c和a仍然指向了那片内存。

  • 但是那片内存内的字段,int类型的value已为默认值(不是之前的5),指针类型的next却成了一个随机值;

这时:

c和a就成了【悬垂指针】;

2.小结


悬垂指针有以下几个要点:

  • 仍然指向之前那个内存块,即使被delete掉了;

  • 如果内存块是一个结构体/类(自定义类型),那么其字段的指针类型将被赋上随机值,delete之前的赋值全部不存在;基本类型则会被设成默认值;

  • 仍然可以对那片内存块进行操作;


发表评论

电子邮件地址不会被公开。 必填项已用*标注