Delphi局部变量内存管理(使用ZLib进行流压缩)
我编写了一个非常简单的函数:Delphi局部变量内存管理(使用ZLib进行流压缩),delphi,memory-management,stream,local-variables,Delphi,Memory Management,Stream,Local Variables,我编写了一个非常简单的函数: function CompressStream(inpStream: TBytesStream; nCmpLevel: TZCompressionLevel = zcFastest): TBytesStream; var aCmpData: TBytes; begin ZCompress(inpStream.Bytes, aCmpData, nCmpLevel); Result := TBytesStrea
function CompressStream(inpStream: TBytesStream;
nCmpLevel: TZCompressionLevel = zcFastest): TBytesStream;
var
aCmpData: TBytes;
begin
ZCompress(inpStream.Bytes, aCmpData, nCmpLevel);
Result := TBytesStream.Create(aCmpData);
end;
这是正确的吗?我怀疑本地数组变量aCmpData
中数据的内存持久性
如果我们剪切行Result:=TBytesStream.Create(aCmpData)
则函数结束时,aCmpData
将超出范围,因此其关联内存将被释放
tbytestream
的构造函数接受一个TBytes
,因此我将其传递给我的本地数组,这应该是一个“按引用”操作
当函数结束并且
aCmpData
超出范围时,我的数据会怎样?类型是一个动态字节数组,声明为:
TBytes = TArray<Byte>;
TBytes=TArray;
这种动态数组由编译器管理,就像
string
变量一样。不需要显式释放变量,它的生存期由编译器管理。当没有对数组的剩余引用时,它将被销毁 动态数组不是COW,只有字符串是。如果您可以确保每次更改之前都有SetLength(myDynArray,Length(myDynArray)),则可以将COW合并到动态数组中代码>@DavidHeffernan为什么要删除答案的一部分?你到底在想什么?@Bozzy否,分配数组时,即在ZCompress()子函数中,调用System.DynArraySetLength时,而不是在try之前,RefCount设置为1。最后阻塞。阅读所有这些注释真是太遗憾了!ArnaudBouchez提出的答案对我来说相当清楚,尽管它可能并不完美(牛对人)。他的例子显示了编译器发出的代码,这很有启发性,而您的edit@DavidHeffernan仍然坚持“没有必要显式释放变量”,这一点我已经知道了,这正是我问这个问题的原因。再次:我不是问我是否必须自己释放内存,相反,我关心的是当变量超出范围时,编译器是否会释放内存,而我仍然在其他地方使用它的内容。