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

Posted 好儿郎-志在四方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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++学习交流群:

以上是关于C++中的悬垂指针(delete指针后依然可以访问的问题)的主要内容,如果未能解决你的问题,请参考以下文章

指针辨析:悬垂指针哑指针野指针智能指针

悬垂指针和野指针的区别

智能指针

话说智能指针发展之路

百战c++

百战c++