169 похожих чатов

Расскажу одну историю по поводу использования таких вещей как шаредпойнтер/автодестрой.

Вот кусок кода, он использует классический TZCompressionStream в этом коде есть грубейшая ошибка, там даже желтым выделено две проблемных строки. В кратце на обьект стрима вешается интерфейс вызовом AutoDestroy а потом производится сжатие вызовом ZStream.CopyFrom.
ВАЖНЫЙ НЮАНС!!!!
Чуть выше по коду в dest была произведена запись 4 байт с размером непакованых данных и сжатые данные должны писаться после этих 4 байт.
Попробуйте предположить что в этом коде не так?
Дам подсказку - в деструкторе TZCompressionStream есть финализация кадра

8 ответов

41 просмотр

короче, раз ни у кого предположений нет, суть проблемы заключается в VCL реализации TZCompressionStream. Дело в том что TZCompressionStream.CopyFrom не гарантирует полное сжатие данных, он пишет в результирующий стрим только те данные, которые влезли в целый кадр, а хвост записывается в деструкторе. И вот тут и есть проблема. На стрим повесили автодестрой, он скопировал то что влезло по кадрам, НО!!! Но деструктор не вызвался, а позиция dest стрима была поправлена, поэтому хвост архива запишется на финализации процедуры по нулевому оффсету, таким макаром полностью похерив сами сжатые данные.

Да, и это тоже, просто коллега обратился мол чет не работает, а я уже запарился им говорить что не юзайте ваши автодестрои и шаред птр-ы почем зря если не гарантируете что все будет работать как надо

Александр (Rouse_) Багель
Да, и это тоже, просто коллега обратился мол чет н...

ну поглядывать надо, бесспорно. абсолютно хорошо автоматом мало что работает

Александр (Rouse_) Багель
короче, раз ни у кого предположений нет, суть проб...

Никогда не нужно использовать авторазрушение в работе с ресурсами. В интерфейсах ввели интерфейс IDisposal, где есть метод Dispose для завершения и зарытия всех ресурсов не зависимо от того, когда вызовется деструктор.

есесно не корректно применяется, только сходу это сложно отследить

Похожие вопросы

Обсуждают сегодня

читать файл максимально быстро? странный вопрос))
zamtmn
50
у меня такой вопрос про память в x86 возник, может кто пояснить?.. у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше)...
Toideng
5
у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше): - "п1" --- виртуальный адрес, то есть тот, который ресолвится в "п...
Toideng
3
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Hello, I need a hand, this is my code: body: ExtendedImageGesturePageView.builder( scrollDirection: Axis.vertical, controller: _pageController, itemCou...
𝘞𝘦𝘢𝘳𝘪𝘯𝘨𝘔𝘦𝘥𝘢𝘭 🦋
2
Guy, how to make redirecting to a page like this when http status 401?
Islam Kurbanov
8
Только что в чате Я.Вебмастера потратил я час на пустые споры с каким-то челом. Он с пеной у рта доказывал мне, что любой "самопис" - дерьмо, что у него дыры в безопасности, ...
Андрей [aharito] Харитонов
2
можно эстетический вопрос? у меня есть кучка мелких-мелких функций типа: function AddInteger(aparent:pointer; aname:PWideChar; aval:Int32):pointer; begin result:=AddNode(apa...
Alexey Kulakov
3
why html and css is not standard? i mean why different browser has their own engine and styles and how them work to show result to end user?
Mr Thieves
11
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Карта сайта