1. 程式人生 > >delphi 指標的記憶體分配和釋放

delphi 指標的記憶體分配和釋放

給字元指標(PChar、PWideChar、PAnsiChar)分配記憶體, 最佳選擇是: StrAlloc.

StrAlloc 雖然最終也是呼叫了 GetMem, 但 StrAlloc 會在指標前面新增 Delphi 需要的 4 個管理位元組(記錄長度).

StrAlloc 分配的記憶體, 用 StrDispose 釋放, 用 StrBufSize 獲取大小.

用 FreeMem 釋放可以嗎? 這樣會少釋放 4 個位元組

StrAlloc分配記憶體的時候要注意了,如果你要儲存n個位元組的資料,一點要寫成StrAlloc(n+1)。因為最後一個字元要用來存放pchar的結束標誌#0。

delphi的幫助如下:

StrAlloc allocates a buffer for a null-terminated string with a maximum length ofSize - 1 (1 byte must be reserved for the termination character). 

var
  p:PChar;
  s:string;
begin
  s:='ABCDEF';
  p:=StrAlloc(Length(s)+1);
  Move(s[1],p^,Length(s)+1);//將s的內容按照位元組複製到p裡面
  //Move(s[1],p^,Length(s));//有興趣的人可以一下這個語句,看出來什麼結果
  ShowMessage(StrPas(p));
  StrDispose(p);
end;


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 吧.
使用AllocMem跟GetMem的區別

AllocMem 分配記憶體後會同時初始化(為空), GetMem 則不會

var
  p1,p2: Pointer;
begin
  p1 := AllocMem(256);
  ShowMessage(PChar(p1)); {這裡會顯示為空}
  FreeMemory(p1);

  p2 := GetMemory(256);
  ShowMessage(PChar(p2)); {這裡會顯示一些垃圾資料, 內容取決與在分配以前該地址的內容}
  FreeMemory(p2);
end;