2012-02-22 12:421 記憶體分配常見函式
getmem和freemem、getmemory和freememory、new和dispose、stralloc和strdispose、allocmem、sysgetmem和sysfreemem。
2 getmem和freemem、getmemory和freememory
由於delphi的記憶體管理都知道分配記憶體的大小,因此在釋放記憶體的時候,只要給指標位址不用給出長度就可以了。另外提倡用getmemory和freememory來代替getmem和freemem,因為freememory會判斷指標是否為空。
3 new和dispose
new和dispose是用來管理變體型別記憶體分配,如變體結構體:
trecord = record
text: string;
value: integer;
end;
precord = ^trecord;
如果用getmem和freemem、getmemory和freememory來釋放,會造成text的記憶體沒有釋放,造成記憶體洩漏。如果用dispose來釋放指標,要加上定義資訊,否則造成記憶體洩漏,正確寫法dispose(precord(point))。
4 stralloc和strdispose
這個函式也是一對,他們分配pchar加乙個cardinal長度,因此一定要用strdispose釋放,否則容易造成4位元組的記憶體洩漏。stralloc分配的指標可以使用strbufsize來獲得大小。
5 allocmem
allocmem是呼叫getmem來分配記憶體,但是它會把記憶體全部初始化為#0,因此推薦allocmem代替getmem和getmemory。以下寫法都是錯誤的,都會造成字串沒有結尾符。
function systempath: string;
begin
setlength(result, getsystemdirectory(nil, 0));
getsystemdirectory(pchar(result), length(result));
result := pchar(result);
end;
function systempath: string;
begin
setlength(result, getsystemdirectory(nil, 0));
getsystemdirectory(pchar(result), length(result));
result := pchar(result);
end;
varsystempath: pchar;
len: cardinal;
begin
len := getsystemdirectory(nil, 0);
systempath := getmemory(len);
getsystemdirectory(systempath, len)
freemem(systempath);
end;
6 sysgetmem和sysfreemem
sysgetmem和sysfreemem是上面函式的底層實現,申請的記憶體不通過delphi記憶體管理器管理,一般不直接使用它們。
記憶體的申請和釋放
常規用法 virtualalloc lpvoid lpaddress,size t dwsize,dword flallocationtype,dword flprotect lpaddress,指定記憶體開始的位址。dwsize,分配記憶體的大小。flallocationtype,分配記憶體的型別...
私有記憶體申請和釋放
私有記憶體 獨佔物理頁 共享記憶體 和別人共享物理頁 由圖可知,多了乙個390 391,兩個物理頁 釋放記憶體 virtualfree lpvoid lpaddress,區域位址 size t dwsize,區域大小,位元組 dword dwfreetype 型別 mem decommit,線形位址...
共享記憶體申請和釋放
私有記憶體 獨佔物理頁 共享記憶體 和別人共享物理頁 invalid handle value,為invalid handle value時,不與檔案關聯 null,安全描述符 page readwrite,保護模式 讀寫的許可權 0,32位通常為空 bufsiz,物理頁的大小 mapfilenam...