English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

c++ 用了new指令開記憶體而在結束時該下delete清除記憶體但忘了下會delete 指令會怎樣 ?

2007-04-03 13:56:58 · 5 個解答 · 發問者 pp 1 in 電腦與網際網路 程式設計

5 個解答

在 JAVA 的程式設計裡,用 new 建立物件後,在程式的尾端,不須加 delete 指令,因為會由 JVM 控管記憶體,程式結束時 JVM 會自動把之前使用的記憶體空間給釋放掉。這是 JAVA 程式方便的地方。


但是在 C++ 裡,有 new 就要加 delete 指令,亦即「有借就要還」,new 是用來動態配置記憶體空間。假如一般編譯器給定的記憶體空間太小,而無法合乎使用者的需求,就必須使用 new 指令。



如果動態配置的空間很大,沒有使用 delete 指令把空間還給作業系統,而繼續開啟其他程式時,其他的程式有可能會無法正常開啟,或是降低作業系統效能,甚至會造成作業系統當機。

2007-04-03 17:37:43 · answer #1 · answered by Big_John-tw 7 · 0 0

首先要看compiler如何實做runtime library,例如有些C compiler編出來的程式碼會自動回收未被參用的資源,有些則是在程式結束時來一次大掃除。不過大部分的C 書籍不會告訴你這些,因為這不是C 的標準特性,而且這些compiler可能需要另外花錢。


由於多數的編譯器其實只是單純透過system call來取得資源,所以就要看OS如何處置。如同喵喵咪所說,一些比較好的OS會給每個程序獨立的空間,而程序結束之後OS會不管三七二十一整個收回來,所以不會有memory leak的情形。


但是無論如何,使用C 還是要非常注意這些細節。除了memory之外,各種resource也都必須納入考量,雖然很多OS會在程式結束後回收記憶體空間,但是OS不一定能正確對C 的object做解構,也就是說某些resource沒辦法釋放。


舉例來說,我之前用過一個軟體,大部分的時候行為正常,但有時候會莫名其妙的把GDI資源用完然後當掉。據說win 95的螢幕保護程式在結束後都不會正確釋放GDI,所以只要多進去幾次螢保就會當機。
即使在Win XP也會發生某些檔案被lock直到重新開機才能解除,雖然理論上XP應該有特別設計避免這種事發生。

2007-04-04 11:04:20 補充:
┼又被吃掉了......
上面的C其實原本是C┼┼

2007-04-04 06:37:10 · answer #2 · answered by novus 6 · 0 0

以現在的先進OS (windwos , linux ..)
一個應用程式都有自己的記億體空間.
當應用程式執行結束後. 所有的東西, 資源通通都會被OS 回收.

因此理想狀況下. new 忘了delete 在程式結束後. 並不會有什麼後遺症.
所有妳配置的memory 都會被OS 回收.

可是那是理想狀態下. 也許OS 有bug . 忘了回收. 就可能導致系統memory 越來越少.

結論. 有借有還. 才是良好的程式設計方法.

2007-04-04 04:55:36 · answer #3 · answered by SiYu 5 · 0 0

如果只是new一個object而非陣列的話,可以使用auto_prt來幫助管理記憶體,
這樣就不用擔心delete的問題。

如果該下delete而未使用的話,如以上版友所說,會造成memory leak(記憶體缺口)。

2007-04-03 18:12:51 · answer #4 · answered by 大貓咪 2 · 0 0

用了new/malloc而忘了delete/free會導致memory leak

2007-04-03 17:19:58 · answer #5 · answered by ? 1 · 0 0

fedest.com, questions and answers