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

给字符串分配指针,我们马上可以联想到有以下这些函数可供选择:
[delphi]  view plain copy
  1. GetMem  
  2. AllocMem  
  3. ReallocMem  
  4. FreeMem  
  5.   
  6. GetMemory  
  7. ReallocMemory  
  8. FreeMemory  
  9.   
  10. New  
  11. Dispose  
  12.   
  13. NewStr  
  14. DisposeStr  
  15.   
  16. StrNew  
  17. StrAlloc  
  18. StrDispose  
  19.   
  20. GlobalAllocPtr  
  21. GlobalFreePtr  
  22.   
  23. WideStrAlloc  
  24. AnsiStrAlloc  
  25. StrDispose  
  26.   
  27. Move  
  28. MoveMemory  
  29. CopyMemory  
  30. ZeroMemory  
  31. FillMemory  
  32. FillChar  
  33.   
  34. StrBufSize  


给字符指针(PChar、PWideChar、PAnsiChar)分配内存,最佳选择是:StrAlloc;用StrDispose释放。例如:

[delphi]  view plain copy
  1. procedure TForm1.Button15Click(Sender: TObject);  
  2. var  
  3.   p: PChar;  
  4. begin  
  5.   //分配内存  
  6.   p := StrAlloc(256);  
  7.   GetWindowText(Handle,p,StrBufSize(p));  
  8.   ShowMessage(p);  
  9.   //释放内存  
  10.   StrDispose(p);  
  11. end;  


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

[delphi]  view plain copy
  1. {用其它方法分配指针}  
  2. procedure TForm1.Button16Click(Sender: TObject);  
  3. var  
  4.   buf : array[0..MAX_PATH] of Char;  
  5. begin  
  6.   //获取WINDOWS所在目录  
  7.   GetWindowsDirectory(buf,Length(buf));  
  8.   ShowMessage(buf);  
  9. end;  

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

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

[delphi]  view plain copy
  1. procedure TForm1.Button17Click(Sender: TObject);  
  2. var  
  3.   p1,p2:PChar;  
  4. begin  
  5.   p1:='Delphi7';  
  6.   p2:= StrNew(p1);  
  7.   ShowMessageFmt('%s,%s',[p1,p2]);  
  8.   StrDispose(p2);  
  9. end;  


New、Dispose:用来分配已知内存大小的指针。例如:

[delphi]  view plain copy
  1. {new、dispose函数}  
  2. procedure TForm1.Button18Click(Sender: TObject);  
  3. type  
  4.   TArr1 = array[0..255of Char;  
  5.   TArr2 = array[0..255of Integer;  
  6.   PArr1 = ^TArr1; //定义数组指针  
  7.   PArr2 = ^TArr2;  
  8. var  
  9.   arr1 : PArr1;  
  10.   arr2 : PArr2;  
  11. begin  
  12.   New(arr1); //给数组指针分配内存  
  13.   New(arr2);  
  14.   
  15.   arr1^ :='万一的博客';  //给数组赋值  
  16.   ShowMessageFmt('%s%s',[arr1[0],arr1[1]]);  
  17.   
  18.   arr2[Low(arr2^)] := Low(Integer);  
  19.   arr2[High(arr2^)]:= MaxInt;  
  20.   ShowMessageFmt('%d,%d',[arr2[0],arr2[255]]);  
  21.   Dispose(arr1); //释放内存  
  22.   Dispose(arr2);  
  23. end;  


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

[delphi]  view plain copy
  1. procedure TForm1.Button19Click(Sender: TObject);  
  2. type  
  3.   TArr = array of Integer;  
  4. var  
  5.   arr : array of Integer;  
  6.   p: Pointer;  
  7. begin  
  8.   SetLength(arr,3);  
  9.   arr[0] := Random(100);  
  10.   arr[1] := Random(100);  
  11.   arr[2] := Random(100);  
  12.   ShowMessageFmt('%d,%d,%d',[arr[0],arr[1],arr[2]]);  
  13.   
  14.   //GetMem(p,3*Sizeof(Integer));  //为无类型的指针分配内存  
  15.   p:=GetMemory(3*SizeOf(Integer));  
  16.   TArr(p)[0]:=Random(100); //无类型的指针转化为动态类型的数组指针  
  17.   TArr(p)[1]:=Random(100);  
  18.   TArr(p)[2]:=Random(100);  
  19.   
  20.   ShowMessageFmt('%d,%d,%d',[TArr(p)[0],TArr(p)[1],TArr(p)[2]]);  
  21.   //FreeMem(p); //释放内存  
  22.   FreeMemory(p);  
  23. end;  

 

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

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

ReallocMemory:在已分配内存的基础上重新分配内存。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值