В поисках ошибки (runtime 216)

Jan 05, 2013 19:17


Интересную статью нашел по отладке одной ошибки, с которой тоже столкнулся.




Эту небольшую заметку я посвящу рассказу о поиске ошибки (runtime error 216) в проекте при его закрытии. Как оказалось ошибка была тривиальна в своей сути, но необычна своими последствиями.

Предыстория такова: необходимо к заданному времени "реанимировать" немаленькую расчетную программу. Обновить некоторые модули, подправить алгоритмы и т.п. Перед началом работы я решил обновить наборы компонентов TMS, ибо с каждым разом там исправляются старые ошибки, правда появляются и новые. В ходе работы по обновлению кода мое внимание привлекло возникновение ошибки при закрытии программы (runtime error 216 - ошибки обращения к памяти). Решение данной проблемы не было приоритетным, и сразу решать ее я не стал, поскольку решил, что возникнуть она могла в следствии повторного освобождения какого-нибудь объекта при закрытии. Появилось свободное время, и изрядно утомившись закрывать диалоговое окно сообщения об ошибке каждый раз при завершении программы, я отправился на поиски. Сразу скажем, что проект был не маленький, и насчитывал порядка 30-40 юнитов (MDI приложение). Переписанных деструкторов классов в проекте не было, были проверены все обработчики событий закрытия форм и т.п. Ошибка возникала после того как завершался обработчик onClose главной формы. После него никаких других событий не вызывалось.

Целиком http://teran.karelia.pro/articles/item_4439.html

Update. Статья уже недоступна. Хорошо хоть успел её прочитать. И, порывшись в программе, нашел ошибку. Как и у автора статьи, у меня проблема была не в каких-то сложных вещах, а в том что нашелся простейший массив, который имеет какое-то неправильное число элементов.

Ar = array[0..9] of string;

При завершении работы программа пытается удалить его из памяти и залазит в чужую область и т.п.

Я вообще редко такими нативными массивами пользуюсь, чаще TStrings. На всю программу нашел 6 массивов. Один случай показался подозрительным.

Во всех случаях код проверил и усилил: инициализировал все элементы массивов, проверил счетчики. Вместо обращения, типа:

for i := 0 to 9 do
Ar[i] := 'x';

сделал везде:

for i := Low(Ar) to High(Ar) do
Ar[i] := 'x';

Излечилось.

программирование, delphi, нерешенные проблемы

Previous post Next post
Up