给字符串分配指针,我们马上可以联想到有以下这些函数可供选择:
- 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;
当然,也可以用其它方法给字符串指针分配内存(数组的内存由系统自动分配和释放),我们手动分配的内存则必须手动释放。例如
- {用其它方法分配指针}
- 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:在已分配内存的基础上重新分配内存。