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++學習交流羣:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章