给字符指针(PChar、PWideChar、PAnsiChar)分配内存, 最佳选择是: StrAlloc.
StrAlloc 虽然最终也是调用了 GetMem, 但 StrAlloc 会在指针前面添加 Delphi 需要的 4 个管理字节(记录长度).
StrAlloc 分配的内存, 用 StrDispose 释放, 用 StrBufSize 获取大小.
StrAlloc 虽然最终也是调用了 GetMem, 但 StrAlloc 会在指针前面添加 Delphi 需要的 4 个管理字节(记录长度).
StrAlloc 分配的内存, 用 StrDispose 释放, 用 StrBufSize 获取大小.
用 FreeMem 释放可以吗? 这样会少释放 4 个字节
StrAlloc分配内存的时候要注意了,如果你要存储n个字节的数据,一点要写成StrAlloc(n+1)。因为最后一个字符要用来存放pchar的结束标志#0。
delphi的帮助如下:
StrAlloc allocates a buffer for a null-terminated string with a maximum length ofSize - 1 (1 byte must be reserved for the termination character).
var
p:PChar;
s:string;
begin
s:='ABCDEF';
p:=StrAlloc(Length(s)+1);
Move(s[1],p^,Length(s)+1);//将s的内容按照字节复制到p里面
//Move(s[1],p^,Length(s));//有兴趣的人可以一下这个语句,看出来什么结果
ShowMessage(StrPas(p));
StrDispose(p);
end;
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 吧.
使用AllocMem跟GetMem的区别
:
AllocMem 分配内存后会同时初始化(为空), GetMem 则不会
var
p1,p2: Pointer;
begin
p1 := AllocMem(256);
ShowMessage(PChar(p1)); {这里会显示为空}
FreeMemory(p1);
p2 := GetMemory(256);
ShowMessage(PChar(p2)); {这里会显示一些垃圾数据, 内容取决与在分配以前该地址的内容}
FreeMemory(p2);
end;