Delphi 内存分配 StrAlloc


本文整理自网络,侵删。

 
给字符指针(PChar、PWideChar、PAnsiChar)分配内存, 最佳选择是: StrAlloc.
StrAlloc 虽然最终也是调用了 GetMem, 但 StrAlloc 会在指针前面添加 Delphi 需要的 4 个管理字节(记录长度).
StrAlloc 分配的内存, 用 StrDispose 释放, 用 StrBufSize 获取大小.
用 FreeMem 释放可以吗? 这样会少释放 4 个字节.
这种类型的指针一般用于 API 函数的参数, 譬如获取窗口标题:

var
   p: PChar; 
begin
   p := StrAlloc(256);
   GetWindowText(Handle, p, StrBufSize(p));
   ShowMessage(p); {Form1}
   StrDispose(p); 
end; 
还有一对非常重要的相关函数: GlobalAllocPtr、GlobalFreePtr; 它们的功能是上面这些都不可替代的!
GlobalAllocPtr 和 GlobalFreePtr 是对系统函数: GlobalAlloc、GlobalFree 的简化, 之所以说它们重要, 只是因为它们可以跨进程操作; 不过 GlobalAllocPtr 是给无类型指针(Pointer)分配内存, 当然就不仅仅用于字符指针了. 
 
New 是给已知大小的指针分配内存; 
GetMem 主要是给无类型指针分配内存; 
尽量使用 GetMemory 来代替 GetMem.
关于 FreeMemory 与 FreeMem 的区别: 
1、FreeMemory 会检查是否为 nil 再 FreeMem, 这有点类似: Free 与 Destroy; 
2、FreeMem 还有个默认参数可以指定要释放的内存大小, 不指定就全部释放(没必要只释放一部分吧); 
3、New 对应的 Dispose 也可以用 FreeMem 或 FreeMemory 代替.
尽量使用 FreeMemory 来释放 GetMem、GetMemory、AllocMem、ReallocMem、ReallocMemory 分配的内存.
ReallocMem、ReallocMemory 是在已分配的内存的基础上重新分配内存, 它俩差不多 ReallocMemory 比 ReallocMem 多一个 nil 判断, 尽量使用 ReallocMemory 吧.

相关阅读 >>

Delphi判断当前用户是否为管理员

Delphi httpencode

Delphi 检测程序有没有被dll注入的代码

Delphi 固定保持datetime日期格式

Delphi删除目录及子目录及所有目录下的文件

Delphi 动态设置屏幕分辨率

Delphi tms web core webmemo 横竖滚动条

Delphi 采集功能代码getstr

Delphi embeddedwb 遍历frames并执行子frame的js脚本

Delphi和c++指针详解

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...