関数を使用してZLib
、メモリ内のストリームを圧縮/解凍しています。無効なストリームを解凍しようとすると、メモリ リークが発生します。次のコードでは、メモリ リークが発生します。
uses
Winapi.Windows, System.Classes, System.ZLib;
function DecompressStream(const AStream: TMemoryStream): Boolean;
var
ostream: TMemoryStream;
begin
ostream := TMemoryStream.Create;
try
AStream.Position := 0;
// ISSUE: Memory leak happening here
try
ZDecompressStream(AStream, ostream);
except
Exit(FALSE);
end;
AStream.Clear;
ostream.Position := 0;
AStream.CopyFrom(ostream, ostream.Size);
result := TRUE;
finally
ostream.Free;
end;
end;
var
s: TMemoryStream;
begin
ReportMemoryLeaksOnShutdown := TRUE;
s := TMemoryStream.Create;
try
DecompressStream(s);
finally
s.Free;
end;
end.
ここで空を解凍しようとするTMemoryStream
と、実行の最後にメモリリークが発生したことが示されます。Delphi XE2 でのテスト。
現実の世界では、アプリケーションが無効なストリームを解凍してメモリをリークしようとする可能性があるため、このリークの発生を防ぐ方法はありますか。
QC: http://qc.embarcadero.com/wc/qcmain.aspx?d=120329 - XE6 以降で修正済みと主張