2010-11-10 51 views
11

如何檢查指針指向的內存是否已成功解除分配?如何檢查內存釋放

+0

需要更多細節:最初分配的內存是如何的?和*爲什麼*你需要檢查它是否被釋放? – 2010-11-10 10:23:45

+0

在應用程序層,它不能。但是,如果你在一些非常低層的內核層工作,可能有辦法做到這一點。 – Chubsdad 2010-11-10 10:27:58

+1

Yeap,你試圖解決什麼是真正的問題? – sharptooth 2010-11-10 10:30:03

回答

12

簡而言之:你不能。

查看諸如Valgrind之類的工具來幫助您調試內存泄漏問題。

其他有些事情你應該考慮:

  • 使用智能指針,這樣你就不用做考慮內存管理,
  • 設置你的指針爲0,你讓他們自由後,使進一步delete沒有任何效果,
  • 使用標準類(vector,...),而不是滾動您自己,
  • 最後,不要使用指針(實際上你幾乎可以)
+0

如何將指針設置爲0有助於解決此問題? – 2010-11-10 10:26:03

+0

避免雙重問題。這可能是OP想要的。 – 2010-11-10 10:27:06

+0

將指針設置爲0太糟糕了,這是一個UB。 – 2010-11-10 10:28:13

5

對不起,很簡短的回答「你不能」

1
  1. 一些正在做靜態代碼分析的工具可以指出一些關於內存釋放的問題。
  2. 使用的valgrind檢查是否有內存泄漏
  3. 避免原始指針 - 使用智能指針代替
2

定義成功!定義釋放!

釋放內存(無論是空閒還是刪除)之後,您不能再使用該指針。所有其他假設都是不相關的。

畢竟,您調用C/C++運行時來釋放內存,但C/C++運行時還會調用操作系統的函數來釋放頁面。你甚至可以在C/C++運行庫的頂部有一個自定義的內存分配器,例如,使用緩存來實現更快的內存分配算法。

所有這些層可能會爲自己保留已釋放的內存(由於碎片或僅僅因爲他們喜歡保留自己),或者可能會通知底層去釋放它。任何事情都可能發生,只是不要再使用那個指針。

0

在C++中,您可以安全地假定重新分配永遠不會失敗。析構函數不能拋出異常,並且保留的實際內存永遠不會被釋放,所以給出這兩點,什麼都不會出錯。

但是,如果您刪除了一個已被刪除的指針,那麼您的程序可能會崩潰。雖然這不是解除分配本身的問題 - 原始delete成功運行。這是一個與你的程序的內存管理問題,如果它試圖刪除一個指針兩次,但是這與現代STL和像std::vectorstd::unique_ptr等智能指針很少有必要...

0

異常處理。即嘗試/ catch塊。

+5

不正確;析構函數不能拋出異常,所以這不會做任何事情。 – 2012-10-31 13:43:24

+0

好點。謝謝。 – 2012-10-31 13:56:09