不平凡軟件,始于2014
首頁(yè) | 加入收藏 | 設(shè)為首頁(yè)
不平凡軟件,始于2014
首頁(yè) | 加入收藏 | 設(shè)為首頁(yè)
您當(dāng)前的位置:首頁(yè) > 精彩分享>詳細(xì)
不平凡和您談---Delete 和 delete [] 的區(qū)別
當(dāng)調(diào)用delete的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用已分配的對(duì)象的析構(gòu)函數(shù)。當(dāng)我們用new [] 分配的對(duì)象是基本數(shù)據(jù)類(lèi)型時(shí),用delete和delete [] 沒(méi)有區(qū)別。但是,當(dāng)分配的對(duì)象是自定義對(duì)象時(shí),二者不能通用。一般來(lái)說(shuō)使用new分配的對(duì)象,用delete來(lái)釋放。用new[] 分配的內(nèi)存用delete [] 來(lái)逐個(gè)釋放。
delete與delete[]需要注意的地方
1:首先來(lái)說(shuō)一個(gè)大家容易忽略的問(wèn)題: 定義:int *p=new int;
這個(gè)大家一看就知道,在內(nèi)存中分配了一個(gè)int類(lèi)型的空間,沒(méi)錯(cuò)。但是我想說(shuō)的是,操作系統(tǒng)在堆在分配了一個(gè)int類(lèi)型空間給p指向的空間,但是p 本身的值是在棧上,我覺(jué)的明白這個(gè)很重要。比如,你需要處理一個(gè)海量數(shù)據(jù),這個(gè)數(shù)據(jù)需要用二維數(shù)組來(lái)表示,你如果這樣定義 int *ptr[MaxNum],然后再循環(huán)為每個(gè)ptr[0~MaxNum-1]分配空間,這個(gè)時(shí)候容易隱含一個(gè)錯(cuò)誤,我們知道內(nèi)存中棧的大小大約就 2M左右,而堆很大,幾乎沒(méi)有限制,當(dāng)你的MaxNum很大的時(shí)候,就會(huì)導(dǎo)致內(nèi)存溢出,因?yàn)閜tr這個(gè)值的本身是在棧上的,而棧的大小就2M左右,而你又 有這么多個(gè)地址要存放,所以會(huì)出錯(cuò)。解決辦法有二個(gè):一:用一維數(shù)據(jù)代替二維數(shù)組;二:定義一個(gè)二維指針; 然后再動(dòng)態(tài)分配。
2:delete與delete[]執(zhí)行遇到的問(wèn)題:
① int *p=new int[100]; int num[100]; p=num; delete []p;
大家能看出這段代碼有什么問(wèn)題嗎?如果你還沒(méi)看出,那么你對(duì)指針及內(nèi)存的動(dòng)態(tài)分配與釋放還需要再學(xué)習(xí)。
錯(cuò)誤是發(fā)生在delete []p,為什么呢?按理說(shuō)用new[]申請(qǐng),用delete[]釋放,應(yīng)該沒(méi)有問(wèn)題啊。但是錯(cuò)誤發(fā)生的原因是因?yàn)? delete[]p釋放的是數(shù)組num[100]的空間,而我們申請(qǐng)的空間根本就沒(méi)有釋放,為什么會(huì)出現(xiàn)這種情況呢?因?yàn)榇藭r(shí)的指針已指向了num數(shù)組的 首地址,而num[100]的空間會(huì)由系統(tǒng)自動(dòng)釋放,而我們現(xiàn)在強(qiáng)行釋放,所以會(huì)發(fā)生錯(cuò)誤。
②int *p=new int[3]; *p=1;
p++;//p的指向改變了,指向了下一空間 *p=2; delete []p;
大家能發(fā)現(xiàn)這段代碼有什么問(wèn)題嗎?
錯(cuò)誤還是發(fā)生在delete[]p,c/c++規(guī)定,當(dāng)刪除一個(gè)指針時(shí),這個(gè)指針應(yīng)指向其首地址,而上面的代碼中p值已經(jīng)發(fā)生了變化,所以會(huì)發(fā)生錯(cuò)誤,如何避免呢?可以備份一份;如 int * pbak=p;在釋放的時(shí)候,用delete[]pbak即可。
③ int* p = new int[10]; int *pp=p; delete []p; delete []pp;
這段代碼哪里又發(fā)生了錯(cuò)誤呢?
我們要知道,p向操作系統(tǒng)申請(qǐng)了10個(gè)int類(lèi)型的空間,而pp只是指向這個(gè)空間,操作系統(tǒng)并沒(méi)有為其再分配10個(gè)int類(lèi)型的空間,所以當(dāng)你用delete[]p釋放這個(gè)空間后,再用delete[]pp釋放就會(huì)發(fā)生錯(cuò)誤。其實(shí)不管用哪個(gè)釋放,只要釋放一次就行了。
④ int a=100; itn *p=&a; delete p;
看到了這里,如果你還不能看出這段代碼的錯(cuò)誤,那你前面的白看了,說(shuō)明你還是沒(méi)有真正懂得啊! 錯(cuò)誤還是發(fā)生在delete p,什么原因?因?yàn)閜并沒(méi)有通過(guò)new獲得內(nèi)存空間,只是指向某個(gè)變量,而delete p是強(qiáng)行釋放a的空間,肯定發(fā)生錯(cuò)誤啦。
相關(guān)新聞換一組