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;

当然,也可以用其它方法给字符串指针分配内存(数组的内存由系统自动分配和释放),我们手动分配的内存则必须手动释放。例如
{用其它方法分配指针}
procedureTForm1.Button16Click(Sender:TObject);
var
buf:array[0..MAX_PATH]ofChar;
begin
//获取WINDOWS所在目录
GetWindowsDirectory(buf,Length(buf));
ShowMessage(buf);
end;

NewStr、DisposeStr为了兼容而存在的,Delphi不提倡使用。用@即可获取字符串指针。
StrNew、StrDispose:用来复制一个相同的字符串指针。例如:
procedureTForm1.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函数}
procedureTForm1.Button18Click(Sender:TObject);
type
TArr1=array[0..255]ofChar;
TArr2=array[0..255]ofInteger;
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)。
procedureTForm1.Button19Click(Sender:TObject);
type
TArr=arrayofInteger;
var
arr:arrayofInteger;
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:在已分配内存的基础上重新分配内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值