Delphi 内存分配 StrAlloc New(转)
2015-06-13 15:35
351 查看
源:Delphi内存分配StrAllocNew
引自:http://anony3721.blog.163.com/blog/static/5119742010824934164/
给字符指针(PChar、PWideChar、PAnsiChar)分配内存,最佳选择是:StrAlloc.
StrAlloc虽然最终也是调用了GetMem,但StrAlloc会在指针前面添加Delphi需要的4个管理字节(记录长度).
StrAlloc分配的内存,用StrDispose释放,用StrBufSize获取大小.
用FreeMem释放可以吗?这样会少释放4个字节.
这种类型的指针一般用于API函数的参数,譬如获取窗口标题:
引自:http://anony3721.blog.163.com/blog/static/5119742010824934164/
给字符指针(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 spcomm 控件的用法
- Delphi中Variant/OleVariant转换为接口
- 垂死或涅槃重生 -- Delphi XE5 我们将宣布感情的回归
- delphi Base64编码/解码及数据压缩/解压知识
- delphi读写剪贴板的一些参考
- 为Delphi窗体加BMP背景图片
- 六月Delphi XE8 及 C++Builder XE8 中文手册如期上市
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (三)用TClientDataSet的“ProviderName”属性连接服务器时,无法找到服务器端的“DatasetProvier”
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (三)用TClientDataSet的“ProviderName”属性连接服务器时,无法找到服务器端的“DatasetProvier”
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (二)想对DBExpress的TSQLDataSet写对数据库操作的SQL语句出错了!
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (二)想对DBExpress的TSQLDataSet写对数据库操作的SQL语句出错了!
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (-)启动创建好的DBExpress工程时候报错了!
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (-)启动创建好的DBExpress工程时候报错了!
- Delphi 2010控件安装
- 转:Delphi 回调函数及例子
- Windows API 的数据类型与 Delphi 数据类型对照表
- Delphi 的运算符列表
- Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单
- Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付)
- Delphi和VC混合编程总结