2016-08-12 45 views
0
  1. 我運行C:釋放calloc後內存使用不反映

    釋放calloc(1024 * 1024 * 1024,的sizeof(INT));

  2. 我檢查我的程序的使用,它是零,但是我從來不打了一個電話給free

編輯:

運行Debian傑西

編輯2:

我使用頂部作爲系統監視器

+1

請提供有關您的問題的更多信息,例如您如何檢查內存使用情況,這將有助於他人瞭解您的實際含義。 – oxnz

+0

你看過哪列?您確定頂級程序沒有將內存使用量上下舍入到最接近的MB或十分之一MB? – nos

+0

所以我們應該猜猜你想要代碼或什麼?請看我看到的一些代碼 – Michi

回答

5

Linux會執行懶惰的內存分配。只有當標記爲分配的頁面出現頁面錯誤時,Linux纔會將其視爲正在使用。嘗試寫入分配的數據中的一個字節並再次檢查內存使用情況。有關Linux中內存分配的更多信息,請檢查http://www.tldp.org/LDP/tlk/mm/memory.html

此外,即使calloc歸零分配的內存,它仍然可以以懶惰的方式完成,導致您所描述的行爲。見How to lazy allocate zeroed memory?

+0

。將它改爲4GB,並且當我將值設置爲隨機整數時,它纔開始上升 – peter

1

您的示例僅分配了幾個K,可能太小而無法看到。但即使你要求更大量的內存,在實際使用內存之前也不會看到使用情況。

默認情況下,Linux不會實際分配內存頁面,除非您以某種方式觸摸它們。雖然calloc應該將內存初始化爲零,但這不會被視爲觸及它,因爲內部會跟蹤未初始化的頁面,並在讀取時返回零。

+1

但'calloc'初始化內存。 – peter

+0

查看mwk的回答。 calloc聲稱初始化內存,但作爲現代Linux平臺的優化,它只是利用了新分配的虛擬內存已經爲零的事實。你本質上可以通過在這樣的平臺上使用malloc來獲得零內存,但是由於你的代碼可能被移植或者在不同的平臺上運行,所以當期望具有零內存時,好的做法總是應該調用calloc真正。 – wojtow

+0

哦,我看到謝謝老兄 – peter