簡體   English   中英

Segfaults和內存泄漏

[英]Segfaults and Memory leaks

我的問題有兩個部分:

  • 是否有可能,如果在分配內存之后但在釋放它之前發生了段錯誤,這會泄漏內存(也就是說,內存永遠不會被釋放導致內存泄漏)?
  • 如果是這樣,有沒有辦法確保在發生段錯誤時清理已分配的內存?

我一直在閱讀有關C ++內存管理的內容,但無法找到有關我特定問題的任何內容。

如果出現seg故障,操作系統負責清理程序保存的所有資源。

編輯:

無論程序如何終止,現代操作系統都會清理任何泄漏的內存。 內存只會在程序的生命周期中泄漏。 大多數操作系統還會清理許多其他類型的資源,例如打開文件和套接字連接。

是否有可能,如果在分配內存之后但在釋放它之前發生了段錯誤,這會泄漏內存(也就是說,內存永遠不會被釋放導致內存泄漏)?

是和否:崩潰的過程應完全由操作系統完成。 但是請考慮您的流程產生的其他流程:它們可能不會完全終止。 但通常這些不應該占用太多資源,但這可能會因您的計划而異。 http://en.wikipedia.org/wiki/Zombie_process

如果是這樣,有沒有辦法確保在發生段錯誤時清理已分配的內存?

如果程序不重要(意味着如果它崩潰就沒有生命危險)我建議修復分段錯誤。 如果您確實需要能夠處理分段錯誤,請參閱以下主題的答案: 如何在Linux中捕獲分段錯誤?

更新 :請注意,盡管可以處理SIGSEGV信號(並繼續在程序流程中),但它不是一種安全的依賴方式,因為 - 正如下面的評論中所指出的 - 它是未定義的行為意味着不同的平台/ compilers / ...可能會有不同的反應。

因此,無論如何,修復分段錯誤(以及Windows上的訪問沖突)應該具有第一優先權。 仍然使用建議的解決方案來處理信號這種方式必須經過徹底測試,如果放入生產代碼,你必須了解它並得出任何后果 - 這可能會有所不同,取決於你的要求所以我不會說出任何名稱。

C ++標准不關心seg-faults(這是特定於平台的事情)。

在實踐中,它實際上取決於你做了什么,以及你對“內存泄漏”的定義是什么。 理論上,您可以為seg-fault信號注冊一個處理程序,您可以在其中進行所有必要的清理。 但是,任何現代操作系統都會自動清除終止進程。

一,系統負責清理資源。 其中之一就是記憶。 您不必擔心段錯誤上永久泄露的RAM。

二,有資源,系統不負責清理。 您可以編寫一個程序,將其pid插入數據庫並在關閉時將其刪除。 這不會在段錯誤中刪除。 您可以1)添加一個處理程序來清理那種非系統資源,或者2)修復程序中的錯誤。

現代操作系統將應用程序的內存分開,以便能夠在它們之后進行清理。 分段錯誤的問題在於它們通常僅在出現問題時才會發生。 此時,默認行為是關閉應用程序,因為它不再按預期運行。

同樣地,除非在某些奇怪的情況下,如果遇到分段錯誤,您的應用程序可能已經做了一些您無法解釋的事情。 因此,“清理”可能幾乎是不可能的。 使用與事務數據庫類似的內存以保證可接受的回滾狀態並非超出可能性的范圍,但這樣做(並且取決於級別的細粒度)可能超出了單調乏味。

更實用的版本可能是在應用程序組件之間提供您自己的沙盒,並在組件死亡時重新啟動組件,將其恢復到可接受的先前保存狀態批發。 這樣你就可以刷新所有已分配的內存並讓它從頭開始。 但是,您仍然會丟失上次檢查點時未保存的任何數據。

暫無
暫無

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

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