[問題] 使用new的記憶體釋放問題

看板C_and_CPP作者 (羊咩)時間15年前 (2009/07/26 18:37), 編輯推噓4(4012)
留言16則, 5人參與, 最新討論串1/3 (看更多)
各位版友好 我想請問一下有關new 和 delete的問題 例如下面function void function_1 (){ int *tmp = new int; } 請問此function_1被呼叫執行後,使用new做出來的記憶體空間是否會被自動release掉? 我原本是認為,因為*tmp是function級的變數,因此function_1結束後*tmp這個用來存放 指標的空間會被release掉,因此它所指向的記憶體空間(new出來的記憶體)也會被放掉. 但後來想想好像不太對,因為C++也不像JAVA一樣有自動清除記憶體的功能. 我是想問說,在使用new時,若沒有配會delete,new出來的空間有可能由系統release掉嗎? 像是程式結束之類的.或是其實程式結束後記憶體依然沒有釋放? 但是因為我試過多次跑程式,再去看記憶體使用量,似乎也沒有增加的跡像. 題外話 會這麼問其實是因為,看了很多使用new的程式,似乎都沒有特別去做delete 不知道這是因為寫程式的人沒有做到正確記憶體釋放..或是這是可以接受的用法 請各位版友不吝指教,謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.46.228.50

07/26 18:46, , 1F
簡單來說 new出來的不會被自動delete 說完了
07/26 18:46, 1F

07/26 18:50, , 2F
tmp這個變數本身的空間會因為是區域變數的關係被釋放掉;
07/26 18:50, 2F

07/26 18:50, , 3F
但它所指向那塊new回來的空間則否, 需要自己做delete的.
07/26 18:50, 3F

07/26 18:51, , 4F
所以單以這個function來看, 就造成memory leak的情況了!
07/26 18:51, 4F

07/26 19:47, , 5F
不知道你是怎麼觀察記憶體用量的,一個int在32bit的OS上面
07/26 19:47, 5F

07/26 19:49, , 6F
頂多只有4byte,如果你跑個1000次,也只有4k。除非你迴圈
07/26 19:49, 6F

07/26 19:50, , 7F
去跑,讓他跑個幾天,你再去看記憶體用量就會知道了...
07/26 19:50, 7F

07/26 20:08, , 8F
有 new 就有 delete 是種好習慣
07/26 20:08, 8F

07/26 20:09, , 9F
我在網路上有看到人說, 程式執行完後, 作業系統其實會
07/26 20:09, 9F

07/26 20:13, , 10F
釋放出記憶體(windows)....有人聽過這種說法嗎 ??
07/26 20:13, 10F

07/26 20:15, , 11F
....我覺得不管怎樣, 最好還是保持好習慣....
07/26 20:15, 11F

07/27 09:53, , 12F
你用new/delete的話,作業系統會在你這個instance結束
07/27 09:53, 12F

07/27 09:53, , 13F
時 把該instance的資源都釋放掉(98以後)
07/27 09:53, 13F

07/27 09:54, , 14F
windows會介入instance資源的管理
07/27 09:54, 14F

07/27 09:54, , 15F
但是這樣你程式沒結束,佔用空間會一直膨脹
07/27 09:54, 15F

07/27 09:55, , 16F
甚至更衰小的,win32也是會有關不掉的zombie的
07/27 09:55, 16F
文章代碼(AID): #1AR37xpp (C_and_CPP)
文章代碼(AID): #1AR37xpp (C_and_CPP)