Нет более жалкого зрелища, чем человек, объясняющий свою шутку.
Марк Твен

Меню навигации для мобильных

Ошибка Z_Free: memory block wrote past end

Автор Nikopol, 21 Май, 2023, 19:13

« предыдущая - следующая »

Nikopol

Нашел читая портянку на раздаче игры. Вроде информация полезная и хочу сохранить, но когда пригодиться не знаю и под какой раздел форума такое подойдёт тоже, так что кину сюда. Полезное именно описание причины ошибки, остальное для контекста.

Цитата: ГумгляВылетает при переходе на уровень и попытке сохраниться. Подскажите, как исправить?

Z_Free: memory block wrote past end
Цитата: Cheshire28Запустить игру от имени администратора.
Цитата: ХейнкельЭтот комрад прав.
Те, кто советовал играться с разрешениями экрана неправы.
Если HD-версия вылетает при переходе на новый уровень (или после первой катсцены, которая, к слову, завершается переходном на новый уровень) -- попробуйте запустить игру от имени администратора.

Цитата: ShogalА вот и не факт. Причина возникновения проблемы следующая.
При выделении блока памяти функцией Z_Malloc в конец блока записывается волшебная константа, равная 0x1d4a11. В функции Z_Free проверяется, что эта константа на месте и буфер не был переполнен. Если константы на месте нет, возникает ошибка "Z_Free: memory block wrote past end".
Переполнение буфера не может произойти из-за недостатка прав доступа, но может произойти из-за недосмотра в программе и недостаточной проверки входных параметров функции.
В случае с неправильным разрешением экрана - вина этому - неумение выделить память нужного размера под буфер. Как наивные люди считают размер BMP? Очень просто: sizeof(Header) + W * H * 3. Но при этом забывают одну простую вещь: выравнивание строк (размер строки в байтах должен быть кратен 4). Когда разрешения экрана все были кратны 4 по ширине, это не было проблемой, буфер, который "навскидку" выделял программист, всегда оказывался равен размеру изображения. Но что, допустим, если у нас 1366х768?
Объём строки равен 1366*3 = 4098 байт. Но если мы выровняем его, получим 4100 байт. И таких строк у нас 768, мы перезаписали целых 1536 байт памяти! Стоит ли ожидать, что в этом случае игра не вылетит? Тут как повезёт, но при первой же попытке освободить блок - функция Z_Free заметит, что память за пределами блока была перезаписана "мусором".
Вы спросите, почему вылет происходит именно при переходе между уровнями и сохранениями? Да потому что при сохранении генерируется превьюшка. Да, когда разработчик писал эту функцию, он не учёл, что размер экрана будет "нестандартный" и не получится наивно наугад выделить под снимок экрана нужного размера буфер. Вот и вся причина возникновения этого бага. И если погуглите по тексту ошибки "Z_Free: memory block wrote past end" - то обнаружите, что Алиса это не единственная игра, где разработчики наступили на эти же грабли.
Против этого бага админские права уж точно не помогут никак, но не факт, что это один единственный баг с переполнением на всю игру, у вас может происходить переполнение по другой причине в другом месте кода.