我写了这个非常简单的函数:

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会超出范围,因此将释放其关联的内存。

TBytesStream的构造函数采用一个TBytes,因此我将其传递给本地数组,这应该是“按引用”操作。

函数结束并且aCmpData超出范围时,我的数据如何处理?

最佳答案

TBytes类型是一个动态字节数组,声明为:

TBytes = TArray<Byte>;


此类动态数组由编译器管理,就像string变量一样。无需显式释放变量,变量的生存期由编译器管理。如果没有剩余的对数组的引用,它将被销毁。

10-06 14:33