delete與delete[]需要注意的地方

 http://wenku.baidu.com/view/0e3d8c1cfc4ffe473368ab5c.html###

 

1:首先來說一個大家容易忽略的問題: 

定義:int *p=new int; 這個大家一看就知道,在內存中分配了一個int類型的空間,

沒錯。但是我想說的是,操作系統在堆在分配了一個int類型空間給p指向的空間,但是p

本身的值是在棧上,我覺的明白這個很重要。比如,你需要

處理一個海量數據,這個數據需要用二維數組來表示,你如果這樣定義

int *ptr[MaxNum],然後再循環爲每個ptr[0~MaxNum-1]分配空間,

這個時候容易隱含一個錯誤,

我們知道內存中棧的大小大約就2M左右,

而堆很大,幾乎沒有限制,當你的MaxNum

很大的時候,就會導致內存溢出,因爲

ptr這個值的本身是在棧上的,而棧的大小就2M

左右,而你又有這麼多個地址要存放,所以會出錯。解決辦法有二個:一:用

一維數據代替二維數組;二:定義一個二維指針; 然後再動態分配。

 

 

int *p=new int[3];

*p=1;

p++;//p的指向改變了,指向了下一空間 

*p=2;

 delete []p;

大家能發現這段代碼有什麼問題嗎?

錯誤還是發生在delete[]p

,c/c++規定,當刪除一個指針時,這個指針應指向其首地址,而上面的代碼中p

值已經發生了變化,所以會發生錯誤,如何避免呢?可以備份一份;如

int * pbak=p;在釋放的時候,用delete[]pbak即可。

 

int a=100;

itn *p=&a;    

delete p;

看到了這裏,如果你還不能看出這段代碼的錯誤,那你前面的白看了,說明你還是沒有真正懂得啊!

 錯誤還是發生在delete p,什麼原因?因爲p並沒有通過new獲得內存空間,只是指向某個變量,而delete p是強行釋放a的空間,肯定發生錯誤啦。

 

3.

delete與delete[]的區別我們首先要知道當delete的時候,系統會自動調用已分配的對象的析構函數。

那麼當我們用new[]分配的對象是基本數據類型的時候,用delete和delete[]沒什麼區別,都可以。但是當用new[]分配的對象是自定義類型的時候,必須要用delete[],這樣它纔會調用每個對象的析構函數,除非你的析構函數沒有做任何事。

 

總結一句話:使用new 得來的空間,用delete 來釋放;使用new []

得來的空間,必須用delete [] 來釋放。這樣肯定不會錯。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章