销毁TReader时的例外情况

时间:2009-02-25 09:17:18

标签: delphi memory-management file-io

以下代码抛出一个EZDecompressionError消息'无效的ZStream操作'每行

Reader.Free

已执行。有人能告诉我这段代码有什么问题吗?

Reader := nil;
Decompressor := nil;
InputFile := TFileStream (FileName, fmOpenRead);
try
  Decompressor := TDecompressionStream.Create (InputFile);
  Reader := TReader.Create (Decompressor, 1024);
  SomeString := Reader.ReadString;
finally
  Reader.Free
  Decompressor.Free;
  InputFile.Free;
end;

我测试过更改内存释放命令的顺序,但这似乎没有帮助。抛弃Reader.Free线当然会导致内存泄漏。

1 个答案:

答案 0 :(得分:4)

Smasher

TReader在析构函数中执行 FStream.Seek(FBufPos - FBufCount,soCurrent)

由于向后搜索,错误得到了提升。如果您在释放阅读器之前调用 Reader.FlushBuffer Reader.Position:= soFromBeginning ,错误是否会消失?


来自TDecompressionstream的评论。 TDecompressionStream是只读和单向的;你可以在溪流中寻找前进,但不能倒退。

的问候,
利芬