Исключение при уничтожении TReader - PullRequest
2 голосов
/ 25 февраля 2009

Следующий код выдает 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 Ответ

4 голосов
/ 25 февраля 2009

Smasher

TReader выполняет FStream.Seek (FBufPos - FBufCount, soCurrent) в своем деструкторе.

Ошибка get возникла из-за обратного поиска. Если вы вызываете Reader.FlushBuffer и Reader.Position: = soFromBeginning до освобождения считывателя, ошибка исчезает?


Из комментариев TDecompressionstream. TDecompressionStream доступен только для чтения и является однонаправленным; Вы можете искать вперед в потоке, но не назад.

С уважением,
Ливны

...