2011-10-01 91 views
0

我必須在C中做一個項目,我必須不斷地爲大數據結構分配內存然後釋放它。那裏有一個函數庫,它有助於跟蹤內存使用情況,所以我可以確定我是否正確地執行了某些操作? (我是新來的C)如何跟蹤C中的內存使用情況?

例如,返回一個函數: A)目前使用的程序的總內存,或 B)的總內存留, 會做的工作。我已經爲此搜索並在其他答案中搜索。

謝謝!

回答

4

嘗試tcmalloc:您正在尋找一個堆分析器,儘管valgrind最初可能更有用。

0

每次分配/釋放內存時,都可以記錄您的數據結構有多大。

2

如果您擔心內存泄漏,valgrind可能是您需要的。另一方面,如果您更關心的是數據結構是否使用了過多的內存,則可以在許多unix標準庫(包括Linux上的glibc)中使用常用的mallinfo函數作爲malloc的擴展。

2

雖然有人叫罵的,由史蒂夫·馬奎爾書"Writing Solid Code"有很多關於如何跟蹤您的內存使用,而無需修改系統內存分配函數合理的想法。基本上,不是直接調用原始malloc()等函數,而是調用您自己的內存分配API,構建在標準之上。您的API可以跟蹤分配和釋放,檢測雙重釋放,釋放未分配的內存,未釋放(泄漏)內存,完成所分配內容的轉儲等。您可能需要從書中挑選代碼或編寫自己的等效代碼。一個有趣的問題是爲每個分配提供堆棧跟蹤;沒有確定調用堆棧的標準方法。 (這本書現在是有點過時,它是書面短短几年的C89標準發佈後,並沒有利用const預選賽。)

有人會說,這些服務可以由系統malloc()提供;的確,他們可以,而且這些日子往往是。您應仔細查看爲您的malloc()版本提供的手冊,並決定它是否爲您提供足夠的。如果不是,那麼包裝器API機制是合理的。請注意,使用您自己的API意味着您跟蹤您明確分配的內容,同時使用未使用系統服務編寫的庫函數來使用您的API--事實上,您的代碼在底層。

您還應該查看valgrind。它在追蹤內存濫用方面做得非常出色,特別是會報告泄漏的內存(已分配內存但未釋放內存)。它還會在您讀取或寫入分配空間的邊界之外時發現,從而發現緩衝區溢出。儘管如此,最終,您需要按照您編寫代碼的方式進行處理,確保每次分配內存時都知道它何時會被釋放。