簡體   English   中英

應用程序突然關閉時堆內存清除

[英]Heap memory clearance when application closes abruptly

我們知道堆用於為應用程序動態分配內存。 如果應用程序終止異常,堆內存如何被清除(從而避免內存泄漏)?

請考慮以下方案:

  • 假設某個應用程序在Windows或Linux上突然崩潰。
  • 我們強制在linux中殺死一個應用程序: kill -9 <process_name>
  • Visual Studio中的C ++程序在執行過程中拋出錯誤。

在上述情況下,堆管理和清理是否有所不同? [請添加可能感興趣的更多用例場景]

這個問題出現在我的腦海中,因為我們總是談論確保代碼中沒有發生內存泄漏。 現在我們如何處理強制關閉應用程序的情況,這可能導致程序退出而不調用內存空閑調用。

如果這種內存泄漏反復發生,操作系統是否可能缺少堆內存? 或者操作系統有辦法處理它......

假設操作系統是Unix或Windows的典型實現,當應用程序被殺死時,操作系統會釋放堆內存,無論它被殺死的方法是什么。

顯然,其他操作系統可能無法做到這一點,並且由每個操作系統以有意義的方式解決這個問題 - 我不知道任何操作系統不會“在被殺死的進程后清理”,但我確定這樣的事情可能存在於這個世界的某個角落。

編輯:可能有其他資源不太容易發布,例如共享內存或多個使用的信號量。 但大多數操作系統傾向於通過釋放被殺死的應用程序的引用來處理這些問題,並讓其他等待任何“等待對象”(互斥,信號量等)的進程“被運行”。

“堆通常由運行時在應用程序啟動時分配,並在應用程序(技術過程)退出時回收”,因此異常/正常地殺死/關閉應用程序不會泄漏任何內存。

至於動態內存管理,你應該使用RAII智能指針就是一個例子 )來處理異常期間的內存泄漏和管理等等。
如果您的應用程序退出,操作系統只會回收它為進程提供的所有內存。 操作系統不了解泄漏,它只是收回它給進程的內容。 所以本身沒有泄漏。 所有內存都被回收。 您可能會泄漏其他資源( 文件描述符等 ),但聰明地使用RAII應該可以防范它。

您的進程如何關閉並不重要,操作系統內存管理器在關閉時會釋放從​​該進程分配的任何剩余內存。 在進程終止之前釋放所有內存是很好的做法,但是在進程關閉后,OS /其他應用程序的可用堆是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM