У меня была эта неприятная ошибка, которая исчезла в прошлом, но теперь через некоторое время она вернулась.
У меня есть два объекта TSam (производных от TPersistent), созданных и загруженных в объект TAsmJob (производных от TObjectList).
Во время выполнения форма создает TStringGrid, а затем AsmJob, который создает эти два объекта SAM (и загружает некоторые данные с диска в каждый из них). AsmJob также назначен сетке.
Когда форма уничтожена, Grid заботится об AsmJob, освобождая его, что освобождает объекты TSam. Вот проблема: первый объект освобождается без проблем, но второй умирает, когда вызывается его унаследованный метод (в деструкторе Destroy).
Я использую FreeAndNil во всей программе, чтобы освободить объекты. Объекты TSam не NIL !!!!! Итак, это первая попытка освободить объекты. Даже данные внутри объектов согласованы.
Основа программы выглядит следующим образом:
**Create:**
Form -> StringGrid
-> AsmJob -> Sam1, Sam2
StringGrid.AsmJob:= AsmJob;
**Free:**
Form -> StringGrid -> AsmJob -> Sam1, Sam2
Я действительно не понимаю, где я пытаюсь дважды освободить или перезаписать объект ПОСЛЕ того, как он был освобожден.
редактирование:
Некоторые из ошибок, которые я получил:
FastMM обнаружил ошибку во время
свободная операция сканирования блока. FastMM
обнаружил, что блок был
изменен после освобождения.
FastMM обнаружил ошибку во время
свободная операция сканирования блока. Блок
заголовок был поврежден.
Detail:
The current thread ID is 0x19C, and the stack trace (return addresses) leading to this error is:
402E77 [System][@FreeMem]
4068DC [System][@DynArrayClear]
405E2D [System][@FinalizeArray]
405D31 [System][@FinalizeRecord]
40432F [System][TObject.CleanupInstance]
404272 [System][TObject.FreeInstance]
404641 [System][@ClassDestroy]
4D313E [UnitSam.pas][TSam.Destroy][297]
4042BF [System][TObject.Free]
4149ED [SysUtils][FreeAndNil]
4D9C0A [UnitAsmJob.pas][UnitAsmJob][TAsmJob.Destroy][180]
У меня все опции "отладки" включены в IDE, включая "Проверка диапазона". Кроме того, FastMM4 настроен на супер агрессивный режим отладки. Без FastMM или вне отладчика программа работает нормально, но я знаю, что это не означает, что ошибки больше нет. На самом деле это работало (возможно) более одного года, пока я не установил FastMM.
редактирование:
Спасибо всем. Нет, я чувствую, что немного двигаюсь в правильном направлении.
Структура программы более сложная. Я предложил только основу, чтобы исходный текст был небольшим. Но какого черта, он уже стал больше :)
Таким образом, эти объекты TSam используются для загрузки данных с диска. Один файл в каждом объекте. Они также занимаются обработкой и проверкой данных. Для каждого из этих TSam у меня также есть графический объект, который показывает на экране (графически) данные, содержащиеся в объектах TSam. Каждая строка в TStringGrid также показывает данные в TSam, но в текстовом виде.
У меня один вопрос: если я разобью программу на более мелкие части, чтобы выяснить, где находится ошибка, она все равно появится? Или возможно появиться только в этой конкретной конфигурации?
Ответ на вопрос «как AsmJob назначается TStringGrid, так что TStringGrid уничтожает AsmJob, вы можете показать нам?»
MyGrid = TStringGrid
public
AsmJob: TAsmJob;
end;
затем где-то в TForm.Create (форма, которая содержит Grid), я делаю
MyGrid.AsmJob=AsmJob;
и в деструкторе MyGrid я делаю:
begin
FreeAndNil(AsmJob);
inherited
end;