垂懸指標問題,這個問題的定義我是知道的。通常是說當指向某塊記憶體的指標被釋放之後,需要及時置空。否則,如果不置空,當下次不小心訪問到時,會導致錯誤。當然,這個問題說起來很簡單。覺得也沒什麼太大的問題,但是指標這一塊確實得非常小心,從下面我范的這個問題說起。
下面這段**是我刷leetcode的時候的一段**,主要刪除鍊錶中重複的元素。當然下面的**是正確的。
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
else
delete cur;
}else
}return ret;
}};
但是,我第一次寫的時候,在注釋處的**是沒有的,也就是說我忘了更新ret的值。**就一直re。
那麼我們仔細分析一下這個問題,對於ret的更新,是在頭結點被刪除的時候才會。那麼如果不更新會導致什麼結果呢?對於頭結點來說,ret和head都指向他,程式在執行迴圈的時候,發現頭結點的值和val一樣,所以考慮刪除這個節點,那麼此時 delete head.會釋放這段空間,由於head又指向了下乙個節點,所以並不會出現垂懸指標問題。但是本題的問題出現的非常隱蔽,當多個指標指向一塊記憶體時,此時用head釋放了該處記憶體,但是ret任然指向這塊記憶體。所以,最後返回的時候,對ret的訪問會導致re。因為ret在之前應該被置位垂懸指標,否則訪問後就會出現錯誤。本題就是栽在了這個上面。
所以,當多個指標指向同一塊記憶體時,務必保證當這塊記憶體釋放時,一定要把指向這塊記憶體的所有指標都置空。
垂懸指標,啞指標,野指標,智慧型指標
定義 指標正常初始化,曾指向乙個物件,該物件被銷毀了,但是指標未製空,那麼就成了懸空指標。解決策略 引入智慧型指標可以防止垂懸指標出現。一般是把指標封裝到乙個稱之為智慧型指標類中,這個類中另外還封裝了乙個使用計數器,對指標的複製等操作將導致該計數器的值加1,對指標的delete操作則會減1,值為0時...
C 空懸指標 野指標
指向已經被釋放的記憶體 或者 指向已經被銷毀的物件。情況一 變數c釋放,dp變成空懸指標 情況二 void func 當free或者delete呼叫時,除了釋放動態申請的記憶體,還要將相關的指標指向null,避免出現空懸指標 情況三 int func void num是基於棧的變數,當func函式返...
空懸指標和野指標
以前經常把這兩個概念混為一談,雖然這它們的概念類似,有一定的相似性,但是各自的成因和解決防範方法都是不同的,特記錄在此。乙個原生指標分配記憶體後,它並沒有探測記憶體是否已經被釋放或者被損壞的能力。當所管理的記憶體被釋放後,若這個指標沒有被銷毀或置為null,它就成了乙個空懸指標。可能會出現隨機的錯誤...