垂懸指針:
在指針被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++學習交流羣: