為了說明什麼是指標懸掛問題,讓我們考慮下面使用簡單字串類string的程式例子:
#include"string.h"
class string
~string()
};void main()
在上列程式中,我們沒有為string類過載賦值運算子,因此,賦值表示式:s1 = s2;是使用預設的賦值運算子完成s2對s1的賦值,這樣做的效果是把物件s2的資料成員(字元指標p和整型量size)逐個拷貝到s1的對應資料成員中,從而使得s1的資料成員原先的值被沖掉了。由於s1.p和s2.p具有相同值,都指向s2的字串,s1.p原先指向的記憶體區不僅沒有釋放,而且被封鎖起來無法再用,這就是所謂的指標懸掛問題。
更嚴重的問題是,由於s1.p和s2.p都指向同一塊記憶體區,當s1和s2這兩個物件生存期結束時(函式main執行結束時),將呼叫兩次析構函式(s1.~string和s2.~string),從而使這塊記憶體被釋放兩次,這是乙個非常嚴重的錯誤。
可能有的讀者對上面的例子感到不易理解,下面我們再通過淺顯易懂乙個小例子來說明什麼情況下容易出現指標懸掛。
#include "stdafx.h"
#include "iostream.h"
void main()
由於指標懸掛是使用指標時容易犯而且不易察覺的錯誤,建議讀者上機實踐,避免在今後的開發中出現此類錯誤造成嚴重後果。
懸掛指標問題例項
今天在寫 的時候遇到乙個問題,當然本身我也是寫乙個小的例子測試記憶體的分配和釋放的問題,一下子碰到了這個懸掛指標的問題 錯誤 include include int main void int b int malloc sizeof int b p free b b null return 0 這段...
懸掛指標與野指標
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...