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 [] 來釋放。這樣肯定不會錯。