C++中的悬垂指针(delete指针后依然可以访问的问题)

垂悬指针:
在指针被delete之后,此时指针被称为空悬指针或者垂悬指针,即指向一块曾经保存she数据对象,但现在已经无效的内存的指针。

在C++编程中,当我们delete一个指针后,指针所指向的堆地址空间便被释放,指针值变成无效。虽然指针已经无效,但在很多机器上指针任然保存着已经被释放了的动态内存地址(并且内存地址中的值也并未被擦除),这会让编程人员误解,甚至理解错误。

观察如下实例:

#include <iostream>
#include <stdio.h>
#include <memory>
#include <QDebug>
using namespace std;
class Base
{
public:
    Base()
    {
        qDebug() << "Base";
    }
    virtual ~Base()
    {
        qDebug() <<"~Base";
    }

    void print()
    {
        qDebug() << "Base Print" << this;
    }
};

int main(int argc, char *argv[])
{
    Base *t = new Base;
    {
        std::unique_ptr<Base> up;  //用智能指针管理指针t,在智能指针离开括号时,其生命周期便结束,同时释放指针t.
        up.reset(t);
        up->print();
        //up.release();
    }
    t->print(); //此时指针t所指向的内存地址已经被释放,但仍然可以调用成员函数,打印指针对象地址。
    //delete t;
    //t = nullptr;

    return 0;
}

下图是在Qt Creator中使用MSVC套件测试的运行结果:
在这里插入图片描述
有木有很惊喜,有木有很意外。

总结:
delete一个指针时,指针指向的内存区域并不会被清空,因为这样会占用CPU周期,此时它是一个危险的指针,会造成一些未定义的现象。像这样的代码有可能会工作很多年,只会在某个时候崩溃,因为程序中的其他地方发生了一些小的改变导致。这也很好地解释了为什么我们Delete一个指针后要将其置为NULL,是为了保证我们使用的是一个有效的指针,而不是会造成不可预知错误的野指针。

同类博文:https://blog.csdn.net/bajianxiaofendui/article/details/86742824#commentBox

C++学习交流群:
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页