delphi 記憶體申請和釋放

2022-03-26 01:47:26 字數 1603 閱讀 6180

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...