【发布时间】:2014-01-04 22:21:33
【问题描述】:
我正在尝试在下面的代码中使用StringOf 函数创建字符串。为什么在用于创建字符串Showmessage 的数组上的ZeroMemory 之后什么都不显示。为什么?在已注释的ZeroMemory 情况下显示=====。
TIdBytes = array of Byte;
procedure fill(var b: TIDBytes);
begin
setlength(b,5);
b[0]:=61;
b[1]:=61;
b[2]:=61;
b[3]:=61;
b[4]:=61;
end;
procedure TMainForm.FormCreate(Sender: TObject);
var
POSSaleTransaction: TPOSSaleTransaction;
s: ansistring ;
b:TIDBytes;
begin
fill(b);
s := StringOf( TArray<byte>(b) );
ZeroMemory(@b, Length(b));
Showmessage(s);
end;
我正在使用 Delphi XE4
我尝试 ZeroMemory 的原因是我不会 100% 确定新创建的字符串不使用对 byte[] 的引用,而是复制 b 数据。在 ZeroMemory 的帮助下,我正在删除 b 的内容,同时期望它不会对字符串产生影响。
【问题讨论】:
-
ZeroMemory(@b, Length(b));这不是擦除指针而不是释放内存的内存泄漏吗? -
我正在使用 Delphi XE4。
-
在这种特殊情况下如何释放内存?
-
为什么要关心 5 字节的内存?它将在程序退出时被释放。就像
s会被释放一样。你不问如何释放s内存,那为什么还要问b?但是您可以调用SetLength(..., 0);- 两者都使用s和b- 或者如果您想提前释放这些缓冲区,您可以将数组分配给nil(这不适用于字符串AFAIR)。 -
无论如何,ZeroMemory 从来没有释放内存,它总是破坏数据并用零覆盖它。不知道谁告诉你 ZeroMemory 可以释放任何东西,他不是在跟你开玩笑。 // FormCreate 中的类型转换也有些不准确。正如您在手册中看到的,StringOf 自然适用于另一种类型,
TBytesdocwiki.embarcadero.com/Libraries/XE5/en/…
标签: string delphi stack dynamic-arrays delphi-xe4