【问题标题】:Exception when destroying TReader销毁 TReader 时出现异常
【发布时间】:2009-02-25 09:17:18
【问题描述】:

以下代码在任何时候都会抛出一个 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 行当然会导致内存泄漏。

【问题讨论】:

    标签: delphi memory-management file-io


    【解决方案1】:

    粉碎机

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

    由于向后查找而引发了错误。如果在释放阅读器之前调用 Reader.FlushBufferReader.Position := soFromBeginning,错误会消失吗?


    来自 TDecompressionstream 的 cmets。 TDecompressionStream 是只读且单向的;您可以在流中向前搜索,但不能向后搜索。

    问候,
    利文

    【讨论】:

    • 不幸的是,错误并没有消失...这一定是一个很常见的使用场景...我真的很困惑...感谢您对此进行调查!
    • 出现错误是因为 TReader 的析构函数可能会在您的流中进行向后搜索。您必须以某种方式确保将其更改为前向搜索以规避异常。
    • 仍然崩溃 :( TReader 不应该与 TDecompressionStream 一起使用吗?
    • 解压到一个TMemoryStream,然后用在TReader上怎么样?
    • @Smasher。我相信拉斯的解决方案会奏效。感谢您加入拉斯。虽然它看起来很常见,但它“很”奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    相关资源
    最近更新 更多