iT邦幫忙

0

[討論] 記憶體漏洞 Memory Leak

小魚 2018-08-28 11:57:4217493 瀏覽
  • 分享至 

  • xImage

記得以前在寫C++的時候,
都說要注意記憶體漏洞,
萬一new了沒有釋放,
需要重開機才能釋放掉記憶體,
今天查了一下網路的資料,
好像說以前的作業系統會有這個問題,
不過現在的作業系統程式關掉之後就會處理掉記憶體,
不知道這樣的觀念正不正確,
有沒有人有在接觸這方面的,
可以討論分享一下,
感恩~

marlin12 iT邦研究生 5 級 ‧ 2018-08-28 18:55:52 檢舉
要解釋memory leak,就要從unmanaged code和managed code說起。
簡單來說,當一個程式被編譯成bytecode,在一個框架(framework)的環境下運行,那個程式就是managed code。相反,當一個程式被編譯成native code,直接被中央處理器(CPU)運行,那個程式就是unmanaged code。
因為managed code的框架控制了整個程式的運行,所以框架可以替程式自動處理memory allocation、security、exception、garbage collection等等。反過來,unmanaged code沒有框架代勞,編程人員就自行處理這些問題。在程式運行完畢後,如果沒有把取用了的記憶體全都釋放,就會導致memory leak。
要決定是否managed code,只是取決於那個開發環境,編譯出來的是否在框架裏運行的bytecode,基本上跟電腦作業系統和程式語言無關。例如,MFC、Win32 API、COM的應用和程式庫,編譯出來的是unmanaged code。.NET框架的應用和程式庫,編譯出來的是managed code。在.net框架中,開發人員可以選用不同的程式語言(C#、C++、VB等)。這些編譯出來的應用,都可以在windows的系統上運行。

[備註] windows 10作業系統依然沒法自動處理程式關掉後的memory leak問題,只是它有多些工具去檢測問題。你看下面這篇文章便知道了。
How to solve memory leaks in Windows 10(https://windowsreport.com/memory-leak-windows-10/#3)

[備註] 其實,.net的應用和程式庫,是可以呼叫和運用unmanaged code(例如:COM、Win32 api)。至於visual studio怎樣編釋和處理unmanaged code,小弟就不得而知了。

小弟對這方面都只是略懂皮毛,如有錯漏,請各位大大代為補充和改正,謝謝!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
weiclin
iT邦高手 4 級 ‧ 2018-08-29 03:12:44

如果你指的是程式中使用 mallocnew 分配到的記憶體,那不管你怎麼惡搞,也不管程式是正常結束或是當掉強制結束,只要 process 結束就會釋放所有的記憶體。也包括所有的資源,File Descriptor,Socket 等等的都會釋放。

這個要驗證很簡單,一個 C++ 程式直接取個 5G 記憶體然後不釋放直接離開,你看一下工作管理員就知道到底有沒有釋放了。現代作業系統因為用的是 Virtual address space,因此在 process 死掉以後,這些記憶體都會自然被釋放掉。

但是程式中還有一些東西天生就設計成與 process 獨立,就算死掉了也會一直存在的資源。例如 shared memory,或是使用某些系統服務或呼叫(IPC),這一類的會在程式結束後繼續留存著,因此不會被釋放。

這邊是我猜想的,理論上剪貼簿可以塞 2G 的資料,你如果程式去塞滿剪貼簿再離開,那應該就不會被釋放。可能要等到剪貼簿被新的資料覆蓋才會釋放,或是看看它怎麼運作的。

fillano iT邦超人 1 級 ‧ 2018-08-29 09:16:10 檢舉

我覺得他是不知道在虛擬機跑的程式,例如Java、Managed Code等等,是會由虛擬機做記憶體管理,所以關掉以後記憶體會釋放。

小魚 iT邦大師 1 級 ‧ 2018-08-29 11:58:16 檢舉

那如果早期的呢?
我記得那時候寫程式好像是 win95 還是 win98 吧,
印象中那時候是有強調一定要delete,
要不然就要重開機了 @@

weiclin iT邦高手 4 級 ‧ 2018-08-29 18:54:47 檢舉

可以說以 Windows NT 為基礎的(XP以後), 都是用新的記憶體管理架構了
至於之前以 DOS 為基礎的(95, 98)就沒那麼先進

我要發表回答

立即登入回答