Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi局部变量内存管理(使用ZLib进行流压缩)_Delphi_Memory Management_Stream_Local Variables - Fatal编程技术网

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仍然坚持“没有必要显式释放变量”,这一点我已经知道了,这正是我问这个问题的原因。再次:我不是问我是否必须自己释放内存,相反,我关心的是当变量超出范围时,编译器是否会释放内存,而我仍然在其他地方使用它的内容。