2010-03-26 77 views
0

任何建議/提示/鏈接/教程,將不勝感激! :)Win32/MFC:如何找到可用內存(RAM)?

+0

我建議您改進問題(或問一個新問題),並提供更多的背景信息,您試圖實現什麼目的,您需要知道「可用RAM」以及哪種內存操作你的程序呢。找出並解釋正確的記憶狀態並不容易。即使你知道它,由於內存碎片,你永遠無法確定malloc/new操作是否成功。作爲一名程序員,我在自己的Carreer中度過了最糟糕的時光,因爲我相信:如果我的計算機中有足夠的內存,我就不會遇到內存操作問題。我真的錯了。 – Slauma 2010-03-26 15:02:14

回答

9

真的是沒有答案。在正常情況下,操作系統將在系統的所有內存中保留東西。基本上,一旦它將某些東西讀入內存中,它就會將它保存在內存中,直到其他東西需要內存,這樣第一個內存纔會被啓動。有很多函數可以讓你獲得關於內存的信息,但是他們都沒有嘗試真正返回一些完全沒有用的內存。我知道其中最接近的是GlobalMemoryStatusEx,它確實返回了可用內存量的數字。

這意味着當前內存中的任何內存當前都位於磁盤上的內存中,因此可以丟棄內存中的副本而無需先將其寫入磁盤。例如,如果你運行一個程序,大部分代碼會留在內存中(直到其他東西需要內存),以防萬一你決定再次運行它。由於它只是磁盤上程序的一個副本,因此可以在需要時將其丟棄,並且(如有必要)從磁盤重新加載。

如果你想要更多的細節,你可以使用像VirtualQueryEx這樣的東西來獲得它 - 但它通常會讓你的信息超載,告訴你在給定的過程中使用的每塊內存,而不是給出一個好的,簡單的數字說「x字節免費」。

3

這很容易回答,空閒內存總是足夠接近0認爲它爲零,並沒有打擾。文件系統緩存始終使用未使用的RAM,您可以在Taskmgr.exe的「性能」選項卡中看到此內容。

如果你實際上是指「免費虛擬內存」,你真正關心的數字,那麼答案是「不太可能」。你需要使用HeapWalk(),這是一個非常尷尬和危險的函數。只有HeapWalk可以檢測堆中標記爲空閒但仍然映射的塊。無論如何,你到達的號碼都毫無意義。一個程序永遠不會用完免費的虛擬內存塊,它總是首先耗盡足夠大的內存塊。

檢測此狀況非常簡單。 malloc返回NULL,新的運算符拋出std :: bad_alloc。處理這種情況並不容易。解決這個問題需要花費不到兩百美元,大約是64位版本Windows的許可費用。