今天在寫**的時候遇到乙個問題,當然本身我也是寫乙個小的例子測試記憶體的分配和釋放的問題,一下子碰到了這個懸掛指標的問題:
錯誤**:
#include #include int main(void)
int *b = (int *)malloc(sizeof(int));
b = p;
free(b);
b = null;
return 0;
}
這段**用gcc編譯沒有任何錯誤,你可能也覺的沒有問題了,其實這段**中存在兩個指標的問題有待解決,我們來看看這段**的記憶體使用情況如下:
沒錯,在棧上有四位元組的記憶體內有釋放,這究竟是為什麼呢?你看出來了嗎?
再來看改正後的**:
#include #include int main(void)
int *b = (int *)malloc(sizeof(int));
int *m = b;
b = p;
free(m);
m = null;
return 0;
}
看看記憶體使用情況:
記憶體全部釋放,對比兩個**,問題應該很明顯了,沒錯,在將b指向了heap上的那塊記憶體以後,我把b的位址指向了p,這時候
申請的堆記憶體的位址就沒有了,我們程式設計師無法獲取,就造成了懸掛指標的問題,所以在第二個程式中我用m儲存這段記憶體的位址,最後釋放。別忘了把m置null。
上面的**都有乙個共同的問題,就是指標p,指標p指向main中乙個子域的區域性變數a,當出域的時候a自動釋放,p有可能成為乙個野指標,野指針對程式的健壯性有較大影響,你並不知道在你的後續程式設計中會不會與這個指標指向的位址發生衝突。
野指標通常編譯器無法檢查出來,所以程式設計時要十分小心。
指標懸掛問題
為了說明什麼是指標懸掛問題,讓我們考慮下面使用簡單字串類string的程式例子 include string.h class string string void main 在上列程式中,我們沒有為string類過載賦值運算子,因此,賦值表示式 s1 s2 是使用預設的賦值運算子完成s2對s1的賦值...
懸掛指標與野指標
owed by 春夜喜雨 懸掛指標 dangling pointers 迷途指標 懸垂指標 野指標 wild pointers 懸掛指標是由於 指標的指向記憶體被刪除導致 例子1 退出if的範圍之後,c變數不再存在,p指向的位址被作業系統 了。指標被懸掛了,後續如果再被使用就會有問題。int p n...
C 關於懸掛指標
如果乙個地方指標既不為空,也沒有被設定為指向乙個已知的物件,則這樣的指標稱為懸掛指標。在程式裡面是很危險的事 如下 include stdafx.h include iostream using namespace std typedef string t void f int p int main...