c 刪除指標(一)

2021-06-20 11:58:32 字數 1589 閱讀 8417

在本地除錯樹形結構時,常常需要釋放一棵樹裡全部指標所佔的空間,這一步不需要了解樹的具體結構;

我認為最簡單通用的方法就是用廣度優先周遊的方法將樹中的非空節點依次刪除;

但這裡由於指標操作的複雜性,寫出來的**常常出現以下兩種情況:1.傳遞的是指標的值而非指標本身,從而沒有釋放想釋放的空間 2.刪除過程中出現了runtime error,即訪問了不能訪問的空間(如懸垂指標or 系統自留位址)

為了避免出現指標使用的混淆,首先要弄清楚指標的位址,指標的內容和指標指向之間的關係:

為此,我寫了下面這段**來測試:

#include#include#include#include#includeusing namespace std;

int main()

結果(codeblocks,mingw)

digit address:0x28fecc

digit content:0x3511a0

digit pointer:5

sub address:0x28fec8

sub content:0x3511a0

sub pointer:5

digit address:0x28fecc

digit content:0x3511a0

digit pointer:3477600

sub address:0x28fec8

sub content:0x3511a0

sub pointer:3477600

可以看出13行將digit的內容(0xad11a0)賦值給了sub,即現在digit和sub的值是相同的,所以解引用之後的值相同(5),但是位址是不同的。因為位址是變數的特徵,由系統自動分配,而非使用者決定。

21行delete sub之後,即釋放了指標的空間,儘管sub和digit指標的內容不變,但是指標對應的int變數已經被撤銷,即相應的堆空間可以被重新分配;

同時這裡的digit就是通常所說的懸垂指標,

在編寫程式的過程中,要避免懸垂指標的干擾,就要在delete之後及時將指標置為null,避免出現莫名其妙的錯誤(在這裡,如果delete sub之後繼續使用*digit,雖然不會出現

segmentation fault,但是資料已經不是我們想要的了)

在弄清楚指標的值和指向的內容之間的關係後,我又嘗試著將指標傳遞給乙個函式

#include#include#include#include#includeusing namespace std;

void delete(int*);

int main()

void delete (int *pint)

digit content 0x3b1118

pint content  0x3b1118

after change

digit content0x3b1118

digit pointer3871088

可以看出在delete函式作用之後,digit指向的空間已經被釋放,但是對引數pint的修改沒有引起digit值的修改,這和傳遞其它型別的引數只會不會改變傳入的引數是乙個道理,

但是實際上申請的空間已經被釋放了

C 使用delete刪除指標

自 眾所周知,最開始我們用new來建立乙個指標,那麼等我們用完它之後,一定要用delete將該指標刪掉。但是,值得注意的是,難道就僅僅是刪除這個指標這麼簡單的麼?下面,我們用乙個程式來說明這個問題 include using namespace std int main 判斷了操作成功之後我們才能進...

C 刪除空指標的乙個坑

最近使用了專案公共庫中看起來很穩定的乙個訊息佇列類 前同事留下的 起初用得還挺好。後來程式中突然出現了記憶體暴漲的情況,最後定位下來是這個類的問題。隨後花了一些時間定位出現問題的 其實在debug時都沒有找到問題 真正找到問題是憑著感覺在一堆 裡揪出了這樣一句話 delete void lparam...

C 指標刪除後要null一下

原文傳送門 我們在刪除乙個指標之後,編譯器只會釋放該指標所指向的記憶體空間,而不會刪除這個指標本身,所以要null一下將這個指標變成空指標,防止變成野指標 眾所周知,最開始我們用new來建立乙個指標,那麼等我們用完它之後,一定要用delete將該指標刪掉。但是,值得注意的是,難道就僅僅是刪除這個指標...