Delphi 局部变量内存管理(使用 ZLib 进行流压缩)
Delphi local variables memory management (stream compression with ZLib)
我写了这个非常简单的函数:
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
,所以我将它传递给我的本地数组,这应该是一个 "by reference" 操作。
当函数结束并且 aCmpData
超出范围时我的数据怎么办?
TBytes
类型是动态字节数组,声明为:
TBytes = TArray<Byte>;
此类动态数组由编译器管理,就像 string
变量一样。不需要显式释放变量,它的生命周期由编译器管理。当没有剩余的数组引用时,它将被销毁。
我写了这个非常简单的函数:
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
,所以我将它传递给我的本地数组,这应该是一个 "by reference" 操作。
当函数结束并且 aCmpData
超出范围时我的数据怎么办?
TBytes
类型是动态字节数组,声明为:
TBytes = TArray<Byte>;
此类动态数组由编译器管理,就像 string
变量一样。不需要显式释放变量,它的生命周期由编译器管理。当没有剩余的数组引用时,它将被销毁。