1. 程式人生 > 實用技巧 >Delphi 記憶體分配 StrAlloc New(轉)

Delphi 記憶體分配 StrAlloc New(轉)

源:Delphi 記憶體分配 StrAlloc New

引自:http://anony3721.blog.163.com/blog/static/5119742010824934164/ 給字元指標(PChar、PWideChar、PAnsiChar)分配記憶體, 最佳選擇是: StrAlloc.
StrAlloc 雖然最終也是呼叫了 GetMem, 但 StrAlloc 會在指標前面新增 Delphi 需要的 4 個管理位元組(記錄長度).
StrAlloc 分配的記憶體, 用 StrDispose 釋放, 用 StrBufSize 獲取大小.
用 FreeMem 釋放可以嗎? 這樣會少釋放 4 個位元組.

這種型別的指標一般用於 API 函式的引數, 譬如獲取視窗標題:


var
p: PChar;
begin

p := StrAlloc(256);
GetWindowText(Handle, p, StrBufSize(p));
ShowMessage(p); {Form1}
StrDispose(p);
end;
還有一對非常重要的相關函式: GlobalAllocPtr、GlobalFreePtr; 它們的功能是上面這些都不可替代的!
GlobalAllocPtr 和 GlobalFreePtr 是對系統函式: GlobalAlloc、GlobalFree 的簡化, 之所以說它們重要, 只是因為它們可以跨程序操作; 不過 GlobalAllocPtr 是給無型別指標(Pointer)分配記憶體, 當然就不僅僅用於字元指標了.

New 是給已知大小的指標分配記憶體; 
GetMem 主要是給無型別指標分配記憶體;
儘量使用 GetMemory 來代替 GetMem.
關於 FreeMemory 與 FreeMem 的區別: 
1、FreeMemory 會檢查是否為 nil 再 FreeMem, 這有點類似: Free 與 Destroy;
2、FreeMem 還有個預設引數可以指定要釋放的記憶體大小, 不指定就全部釋放(沒必要只釋放一部分吧);
3、New 對應的 Dispose 也可以用 FreeMem 或 FreeMemory 代替.
儘量使用 FreeMemory 來釋放 GetMem、GetMemory、AllocMem、ReallocMem、ReallocMemory 分配的記憶體.
ReallocMem、ReallocMemory 是在已分配的記憶體的基礎上重新分配記憶體, 它倆差不多 ReallocMemory 比 ReallocMem 多一個 nil 判斷, 儘量使用 ReallocMemory 吧.