指標 delete 刪除的是它指向的那部分空間

2021-09-05 08:51:18 字數 1592 閱讀 3975

**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 ...