**romanten
蠻不錯的、
說白了就是刪除的是 指標原本所指的那部分記憶體而已 指標還可以使用 但是避免野指標
***## 指標p的delete:
***p所指的空間。
比如 int* p = new int(1);
delete p;
就會在堆上分配一塊記憶體,當作int型別使用,並賦值為1,將其位址儲存在棧上的int*型別的p裡。delete p會釋放p所指向的記憶體。而這裡p為一自動變數,其本身在程式退出其作用域時銷毀。
用delete命令處理某個指標,說是把那個指標刪除了是不正確的。
delete命令指示釋放了那個指標原本所指的那部分記憶體而已。被delete後的指標p的值(位址值)並非就是null,而是隨機值。
也就是被delete後,如果不再加上一句p=null,p就成了「野指標」,在記憶體裡亂指一通。
如果在定義p的那個函式在delete了p後,沒再呼叫p,就沒什麼問題,在這個函式結束後,p就會跟其它變數一樣被消除。但若在那個函式裡delete了p後,又沒再給p賦值(位址值),再次呼叫p就危險了,因為這時p在記憶體裡亂指,有可能指到一些重要位址,隨時可能系統崩潰。
//p=null是個好習慣
//就像你蹲完廁所要洗手一樣
《問題》危險的**:
int* p=new int(1);
delete p;
delete p;
**一:
連續兩次對同乙個指標delete ,會造成嚴重的錯誤。編譯器會檢測出這樣的錯誤嗎?或許一些編譯器會的,但別太過指望編譯器。
**二:
第一次delete後,p自動為空(null)了嗎?不是的。
**三:
在delete之前會自動檢查p是否為空(null),如果為空(null)就不再delete了嗎?確實是如此。
**四:
刪除為空(null)的指標是不會有任何問題的嗎?確實是如此。
**五:
#define safe_delete(p) delete (p); p = 0;
這樣就就萬事大吉了嗎?好像不是的。
delete p+1;//在c++中是正確的
safe_delete(p+1)將會導致錯誤
**六:
沒有好的方法解決重複釋放這樣的問題,只能靠程式設計師的細心了。
《結論》安全的**:
int* p=new int(1);
delete p;
p = null;
(1)delete 一次以後,p成了野指標,它作為位址的值還是有效地沒還可以訪問它以前指向的記憶體,不過那片記憶體被重新格式化了;
(2)p不等於null,用 if(p) 語句不能判斷它指向的記憶體是否有效(此時它指向的記憶體無效,p本身有效);
(3)delete 一次以後,不能再次delete,否則會報錯;
(4)此時如果誤用p指標,仍然可以修改記憶體的值和從該處取出數值,但此時資料不受保護,該記憶體空間可能被重新被分配給別的變數;
(5)如果p指向的空間再次被new函式分配,即使是分配給別的指標,即使分配大小與原來不一樣,p又恢復了效力,可以改變記憶體的值,甚至可以重新被delete,p的作用與新分配的指標一樣;
使用delete刪除指標
原文 用delete命令處理某個指標,說是把那個指標刪除了是不正確的。delete命令指示釋放了那個指標原本所指的那部分記憶體而已。被delete後的指標p的值 位址值 並非就是null,而是隨機值。也就是被delete後,如果不再加上一句p null,p就成了 野指標 在記憶體裡亂指一通。如果在定...
C 使用delete刪除指標
自 眾所周知,最開始我們用new來建立乙個指標,那麼等我們用完它之後,一定要用delete將該指標刪掉。但是,值得注意的是,難道就僅僅是刪除這個指標這麼簡單的麼?下面,我們用乙個程式來說明這個問題 include using namespace std int main 判斷了操作成功之後我們才能進...
動態記憶體分配與指向它的指標變數
記憶體的動態分配 全域性變數是分配在記憶體中的靜態儲存區的,非靜態的區域性變數 包括形參 是分配在記憶體中的動態儲存區的,這個儲存區是乙個稱為棧 stack 的區域。c語言允許建立動態儲存分配區域,存放臨時用的資料。這些臨時資料存放在乙個特別的儲存區,稱為堆 heap 區。建立記憶體的動態分配 1 ...