Delphi的学习笔记——内存操作函数

给字符串分配指针,我们马上可以联想到有以下这些函数可供选择:

GetMem  
AllocMem  
ReallocMem  
FreeMem  
  
GetMemory  
ReallocMemory  
FreeMemory  
  
New  
Dispose  
  
NewStr  
DisposeStr  
  
StrNew  
StrAlloc  
StrDispose  
  
GlobalAllocPtr  
GlobalFreePtr  
  
WideStrAlloc  
AnsiStrAlloc  
StrDispose  
  
Move  
MoveMemory  
CopyMemory  
ZeroMemory  
FillMemory  
FillChar  
  
StrBufSize  
给字符指针(PChar、PWideChar、PAnsiChar)分配内存,最佳选择是:StrAlloc;用StrDispose释放。例如:

procedure TForm1.Button15Click(Sender: TObject);  
var  
  p: PChar;  
begin  
  //分配内存  
  p := StrAlloc(256);  
  GetWindowText(Handle,p,StrBufSize(p));  
  ShowMessage(p);  
  //释放内存  
  StrDispose(p);  
end;  

当然,也可以用其它方法给字符串指针分配内存(数组的内存由系统自动分配和释放),我们手动分配的内存则必须手动释放(与C一样)

例如

procedure TForm1.Button16Click(Sender: TObject);  
var  
  buf : array[0..MAX_PATH] of Char;  
begin  
  //获取WINDOWS所在目录  
  GetWindowsDirectory(buf,Length(buf));  
  ShowMessage(buf);  
end;  

NewStr、DisposeStr为了兼容而存在的,Delphi不提倡使用。用@即可获取字符串指针。

StrNew、StrDispose:用来复制一个相同的字符串指针。例如:

procedure TForm1.Button17Click(Sender: TObject);  
var  
  p1,p2:PChar;  
begin  
  p1:='Delphi7';  
  p2:= StrNew(p1);  
  ShowMessageFmt('%s,%s',[p1,p2]);  
  StrDispose(p2);  
end;  
New、Dispose:用来分配已知内存大小的指针。例如:
{new、dispose函数}  
procedure TForm1.Button18Click(Sender: TObject);  
type  
  TArr1 = array[0..255] of Char;  
  TArr2 = array[0..255] of Integer;  
  PArr1 = ^TArr1; //定义数组指针  
  PArr2 = ^TArr2;  
var  
  arr1 : PArr1;  
  arr2 : PArr2;  
begin  
  New(arr1); //给数组指针分配内存  
  New(arr2);  
  
  arr1^ :='万一的博客';  //给数组赋值  
  ShowMessageFmt('%s%s',[arr1[0],arr1[1]]);  
  
  arr2[Low(arr2^)] := Low(Integer);  
  arr2[High(arr2^)]:= MaxInt;  
  ShowMessageFmt('%d,%d',[arr2[0],arr2[255]]);  
  Dispose(arr1); //释放内存  
  Dispose(arr2);  
end;  

GetMem、FreeMem:给无类型指针分配内存,不会进行初始化。(尽量用GetMemory、FreeMemory替换 GetMem、FreeMem)。

procedure TForm1.Button19Click(Sender: TObject);  
type  
  TArr = array of Integer;  
var  
  arr : array of Integer;  
  p: Pointer;  
begin  
  SetLength(arr,3);  
  arr[0] := Random(100);  
  arr[1] := Random(100);  
  arr[2] := Random(100);  
  ShowMessageFmt('%d,%d,%d',[arr[0],arr[1],arr[2]]);  
  
  //GetMem(p,3*Sizeof(Integer));  //为无类型的指针分配内存  
  p:=GetMemory(3*SizeOf(Integer));  
  TArr(p)[0]:=Random(100); //无类型的指针转化为动态类型的数组指针  
  TArr(p)[1]:=Random(100);  
  TArr(p)[2]:=Random(100);  
  
  ShowMessageFmt('%d,%d,%d',[TArr(p)[0],TArr(p)[1],TArr(p)[2]]);  
  //FreeMem(p); //释放内存  
  FreeMemory(p);  
end;  

AllocMem、FreeMemory:分配内存后同时初始化为空。

 尽量使用FreeMemory来释放GetMem、GetMemory、AllocMem、ReallocMem、ReallocMemory分配内存

ReallocMemory:在已分配内存的基础上重新分配内存。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值