C 基礎 指標 野指標和free

2022-07-11 06:42:11 字數 751 閱讀 9967

野指標的重複釋放問題

最近發現了這樣乙個問題,乙個指標釋放兩次之後,若在中間不置空,會報invalid address specified to rtlvalidateheap 無效的堆位址 錯誤。

#include #include #include using namespace std;

int main()

想搞清楚為什麼發生這種錯誤,首先得先搞清楚free()做了什麼:

#include using namespace std;

int main()

從**中可以看到,free()前後p的值實際上是沒有變化的,也就是說,p並沒有置為空。

若此時加入該語句:

char x = *p;
則會觸發程式斷點invalid address specified to rtlvalidateheap 無效的堆位址

然而明明p是有指向的,為什麼會是無效的堆位址呢?

原因就是free()函式只是告訴了作業系統,這塊記憶體我不再使用了,作業系統可以將該塊記憶體重新分配了。

回到原有問題,當p被free()過一次之後,它實際上就成為了乙個野指標,指向乙個作業系統所保護的區域,這個區域將在未來可能被其他的指標指向。因此,我們第二次free(p)的時候,它實際上就是在操作乙個可能已經其他模組用到的空間了,這時,也就出發了invalid address specified to rtlvalidateheap 。

野指標和free總結超有用

所指向的記憶體未申請 2.所指向的記憶體被釋放 當你訪問乙個未申請的記憶體區域時,系統會判定我們沒有許可權,無法訪問。記憶體被釋放後你再訪問,結果完全不可預知,很大機率會出現段錯誤 segmentation fault 這是提示你訪問越界了。野指標怎麼出現的?在 中以下幾種情況會出現野指標 1.指標...

c 空指標和野指標

野指標不同於空指標,空指標是指乙個指標的值為null,而野指標的值並不為null,野指標會指向一段實際的記憶體,只是它指向 我們並不知情,或者是它所指向的記憶體空間已經被釋放,所以在實際使用的過程中,我們並不能通過指標判空去識別乙個指標是否為野指標。野指標可能指向乙個可用的,但是正在被使用的空間,如...

c 空指標,野指標

當給空指標所指的位址賦值時,會報錯 int p nullptr p 10 int p 野指標,未初始化int p new int delete p 刪除後不知道p指向 include using namespace std class a void a func void void test voi...