1. 程式人生 > >windows記憶體分配總結

windows記憶體分配總結

     由於每個程序的區域性堆很小,所以在區域性堆中分配記憶體會受到空間的限制。但這個堆是每個程序私有的,相對而言分配資料較安全,資料訪問出錯不至於影響到整個系統。
     而在全域性堆中分配的記憶體是為各個程序共享的,每個程序只要擁有這個記憶體塊的控制代碼都可以訪問這塊記憶體,但是每個全域性記憶體空間需要額外的記憶體開銷,造成分配浪費。而且一旦發生嚴重錯誤,可能會影響到整個系統的穩定。

    不過在Win32中,每個程序都只擁有一個省缺的私有堆,它只能被當前程序訪問。應用程式也不可能直接訪問系統記憶體。所以在Win32中全域性堆和區域性堆都指向程序的省缺堆。用LocalAlloc/GlobalAlloc分配記憶體沒有任何區別。甚至LocalAlloc分配的記憶體可以被 GlobalFree釋放掉。所以在Win32下程式設計,無需注意Local和Global的區別,一般的記憶體分配都等效於 HeapAlloc(GetProcessHeap(),...)。
LocalAlloc對應的釋放函式為LockFree。
4. VirtualAlloc:該函式的功能是在呼叫程序的虛地址空間,預定或者提交一部分頁,如果用於記憶體分配的話,並且分配型別未指定MEM_RESET,則系統將自動設定為0;其函式原型:
LPVOID VirtualAlloc(
LPVOID lpAddress, // region to reserve or commit
SIZE_T dwSize, // size of region
DWORD flAllocationType, // type of allocation
DWORD flProtect // type of access protection
);
VirtualAlloc 可以通過並行多次呼叫提交一個區域的部分或全部來保留一個大的記憶體區域。多重呼叫提交同一塊區域不會引起失敗。這使得一個應用程式保留記憶體後可以隨意提交將被寫的頁。當這種方式不在有效的時候,它會釋放應用程式通過檢測被保留頁的狀態看它是否在提交呼叫之前已經被提交。
VirtualAlloc對應的釋放函式為VirtualFree。
5.Malloc:malloc 與free是C++/C語言的標準庫函式,可用於申請動態記憶體和釋放記憶體。對於非內部資料型別的物件而言,光用 malloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行解構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制權限之內,不能夠把執行建構函式和解構函式的任務強加於malloc/free。
6.New:new/delete 是C++的運算子。可用於申請動態記憶體和釋放記憶體。C++語言需要一個能完成動態記憶體分配和初始化工作的運算子new,以一個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。C++程式經常要呼叫C函式,而C程式只能用malloc /free管理動態記憶體。new 是個操作符,和什麼"+","-","="...有一樣的地位.
        malloc是個分配記憶體的函式,供你呼叫的.
        new是保留字,不需要標頭檔案支援.
        malloc需要標頭檔案庫函式支援.new 建立的是一個物件,
        malloc分配的是一塊記憶體.
        new建立的物件你可以把它當成一個普通的物件,用成員函式訪問,不要直接訪問它的地址空間
        malloc分配的是一塊記憶體區域,就用指標訪問好了,而且還可以在裡面移動指標.
記憶體洩漏對於malloc或者new都可以檢查出來的,區別在於new可以指明是那個檔案的那一行,而malloc沒有這些資訊。new可以認為是malloc加建構函式的執行。new出來的指標是直接帶型別資訊的。而malloc返回的都是void指標。