【发布时间】:2013-11-20 02:26:47
【问题描述】:
我一直在使用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 开始已修复
【问题讨论】:
-
一个不错的 SSCCE,但您也应该发布泄漏消息。
-
Mayeb 您可以使用“标记和扫描”方法吗?解压前拦截GetMem/FreeMem/ReallocMem,跟踪所有分配的资源。然后在解压尝试后将它们解钩并释放所有分配的内存。
-
@LievenKeersmaekers 这是通用泄漏消息 - “发生了意外的内存泄漏。意外泄漏的中型和大型块的大小为:7212”
-
@MarkoPaunovic - 如果我没记错的话,您应该能够看到泄漏的对象/字符串/...以及分配的位置。这应该给你一些关于你是否应该关注它或者它是否不是问题的指示。我无法测试这个(没有 Delphi) 和完整的消息可能有帮助。
-
@LievenKeersmaekers 仅当他将下载并安装完整的 FastMM4 (fastmm.sf.net) 发行版并设置其调试选项以获得最详细的报告。
标签: delphi compression delphi-xe2 zlib