程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Delete 和 delete [] 的區別

Delete 和 delete [] 的區別

編輯:C++入門知識

使用new分配的對象,用delete來釋放。用new[] 分配的內存用delete [] 來逐個釋放。

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

1:首先來說一個大家容易忽略的問題: 定義:int *p=new int; 

這個大家一看就知道,在內存中分配了一個int類型的空間,沒錯。但是我想說的是,操作系統在堆在分配了一個int類型空間給p指向的空間,但是p本身的值是在棧上,我覺的明白這個很重要。比如,你需要處理一個海量數據,這個數據需要用二維數組來表示,你如果這樣定義int *ptr[MaxNum],然後再循環為每個ptr[0~MaxNum-1]分配空間,這個時候容易隱含一個錯誤,我們知道內存中棧的大小大約就2M左右,而堆很大,幾乎沒有限制,當你的MaxNum很大的時候,就會導致內存溢出,因為ptr這個值的本身是在棧上的,而棧的大小就2M左右,而你又有這麼多個地址要存放,所以會出錯。解決辦法有二個:一:用一維數據代替二維數組;二:定義一個二維指針; 然後再動態分配。 

2:delete與delete[]執行遇到的問題:

 ①   int  *p=new int[100];       int  num[100];       p=num;       delete []p; 

大家能看出這段代碼有什麼問題嗎?如果你還沒看出,那麼你對指針及內存的動態分配與釋放還需要再學習。 

錯誤是發生在delete []p,為什麼呢?按理說用new[]申請,用delete[]釋放,應該沒有問題啊。但是錯誤發生的原因是因為delete[]p釋放的是數組num[100]的空間,而我們申請的空間根本就沒有釋放,為什麼會出現這種情況呢?因為此時的指針已指向了num數組的首地址,而num[100]的空間會由系統自動釋放,而我們現在強行釋放,所以會發生錯誤。

 ②int *p=new int[3];    *p=1; 

    p++;//p的指向改變了,指向了下一空間    *p=2;    delete []p; 

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

錯誤還是發生在delete[]p,c/c++規定,當刪除一個指針時,這個指針應指向其首地址,而上面的代碼中p值已經發生了變化,所以會發生錯誤,如何避免呢?可以備份一份;如 int * pbak=p;在釋放的時候,用delete[]pbak即可。 

③  int* p = new int[10];    int *pp=p;      delete []p;   delete []pp; 

這段代碼哪裡又發生了錯誤呢? 

我們要知道,p向操作系統申請了10個int類型的空間,而pp只是指向這個空間,操作系統並沒有為其再分配10個int類型的空間,所以當你用delete[]p釋放這個空間後,再用delete[]pp釋放就會發生錯誤。其實不管用哪個釋放,只要釋放一次就行了。

 ④ int a=100;      itn *p=&a;      delete p; 

看到了這裡,如果你還不能看出這段代碼的錯誤,那你前面的白看了,說明你還是沒有真正懂得啊! 錯誤還是發生在delete p,什麼原因?因為p並沒有通過new獲得內存空間,只是指向某個變量,而delete p是強行釋放a的空間,肯定發生錯誤啦。

 

聲明:今天工作的時候在delete 和delete[] 之間犯了錯誤,所以網上查到了上述相關知識。上述內容系我轉載,版權屬原作者。在此,謝謝原作者分享!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved