Delphi 内存分配 StrAlloc New(转)

源:Delphi 内存分配 StrAlloc New

引自: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 吧.
时间: 2024-08-24 15:35:45

Delphi 内存分配 StrAlloc New(转)的相关文章

终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good

这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ---------------------------------------------------------------------------------------------------------------- 在学习Delphi的时候,一个很好的建议是和C/C++去类比着学习,从指针,到内存管理,到数组,到面向对象……各个方面,都是有很多可以相似和或者也有不同的方,类比着学习,一

delphi.memory.分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同,内存分配函数

来自:http://www.cnblogs.com/qiusl/p/4028437.html?utm_source=tuicool&utm_medium=referral -------------------------------------------------------------------------------------------------------- 我估摸着内存分配+释放是个基础函数,有些人可能没注意此类函数或细究,但我觉得还是弄明白的好. 介绍下面内存函数前,先说

Delphi内存与指针学习摘要

(1)StrAlloc StrDispose给字符指针(PChar.PWideChar.PAnsiChar)分配内存, 最佳选择是: StrAlloc.(注: 也可以用array[0..Max_Path] of Char)StrAlloc 分配的内存, 用StrDispose 释放, 用 StrBufSize 获取大小.(2)New DisposeNew 是给已知大小的指针分配内存 释放: Dispose;(3)GetMem FreeMemGetMem 主要是给无类型指针分配内存 释放: Fre

delphi 内存申请和释放

2012-02-22 12:421 内存分配常见函数GetMem和FreeMem.GetMemory和FreeMemory.New和Dispose.StrAlloc和StrDispose.AllocMem.SysGetMem和SysFreeMem. 2 GetMem和FreeMem.GetMemory和FreeMemory由于DELPHI的内存管理都知道分配内存的大小,因此在释放内存的时候,只要给指针地址不用给出长度就可以了.另外提倡用GetMemory和FreeMemory来代替GetMem和

Delphi的分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同

转载自:http://www.cnblogs.com/qiusl/p/4028437.html?utm_source=tuicool 我估摸者内存分配+释放是个基础的函数,有些人可能没注意此类函数或细究,但我觉得还是弄明白好. 介绍下面内存函数之前,先说一下MM的一些过程,如不关心课忽略: TMemoryManger = record GetMem: function(Size: Integer): Pointer; FreeMem: function(P: Pointer): Integer;

delphi.memory.分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同

来自:http://www.cnblogs.com/qiusl/p/4028437.html ------------------------------------------------------------------ 我估摸着内存分配+释放是个基础函数,有些人可能没注意此类函数或细究,但我觉得还是弄明白的好. 介绍下面内存函数前,先说一下MM的一些过程,如不关心可忽略: TMemoryManager = record GetMem: function(Size: Integer): P

Delphi 内存与指针

源:Delphi 内存与指针 Delphi 的内存操作函数(1): 给字符指针分配内存 Delphi 的内存操作函数(2): 给数组指针分配内存 Delphi 的内存操作函数(3): 给结构体指针分配内存 Delphi 的内存操作函数(4): 清空与填充内存 Delphi 的内存操作函数(5): 复制内存 Delphi 的内存操作函数(6): 跨进程的内存分配 查看内存数据的函数 获取打开的记事本中的内容

【c/c++】内存分配大小

测试平台:linux 32位系统 用sizeof()运算符计算分配空间大小.单位:字节 1. 数组名与变量名的区别 int main() { char q[] = "hello"; cout << "q:" << sizeof(q) << endl; char *mq = q; cout << "mq:" << sizeof(mq) << endl; const char *

JAVA中堆栈和内存分配

(一).栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中.)3. 堆:存放所有new出来的对象.4. 静态域(属于方法区) :存放静态成员(static定义的)5. 常量池 (属于方法区):存放字符串常量和基本类型常量(public static final).6. 非RAM存储:硬盘等永久存储空间这里我们主要关心栈