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

来源:互联网 发布:python打印百分数 编辑:程序博客网 时间:2024/05/29 13:57

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

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 0
原创粉丝点击