У меня была эта неприятная ошибка, которая исчезла в прошлом, но теперь через некоторое время она вернулась.FastMM4 говорит, что «заголовок блока поврежден»
У меня есть два объекта TSam (полученные из TPersistent), созданные и загруженные в объект TAsmJob (полученный из TObjectList).
Во время выполнения форма создает TStringGrid, а затем AsmJob, который создает эти два объекта SAM (и загружает некоторые данные с диска в каждом из них). AsmJob также назначается сетке. Когда форма уничтожена, сетка заботится о AsmJob, освобождая ее, что освобождает объекты TSAM. Вот проблема: первый объект освобождается без проблем, а второй умирает, когда вызывается его унаследованный метод (в Destroy destructor).
Я использую FreeAndNil во всей программе, чтобы освободить объекты. Объекты TSAM не являются NIL !!!!! Итак, это первая попытка освободить объекты. Даже данные внутри объектов согласованы.
Основу программы выглядит следующим образом:
**Create:**
Form -> StringGrid
-> AsmJob -> Sam1, Sam2
StringGrid.AsmJob:= AsmJob;
**Free:**
Form -> StringGrid -> AsmJob -> Sam1, Sam2
Я действительно не понимаю, где я стараюсь дважды бесплатно или перезаписать объект после того, как был освобожден.
редактировать:
Некоторые из ошибок, которые я получил:
FastMM обнаружил ошибку во время операции сканирования в свободного блока. FastMM обнаружил, что блок был изменен после освобождения.
Компания FastMM обнаружила ошибку во время операции бесплатного сканирования кадра . Заголовок блока поврежден.
деталь:
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, в том числе "Range Check". Кроме того, FastMM4 настроен на режим супер агрессивной отладки. Без FastMM или вне отладчика программа работает нормально - но все же я знаю, что это не значит, что ошибки больше нет. Фактически он работал (возможно) более одного года, пока я не установил FastMM.
редактировать:
Благодаря всем. Нет, я чувствую, что немного двигаюсь в хорошем направлении.
Структура программы сложнее Я предложил только основу, чтобы сохранить исходное сообщение маленьким. Но что, черт возьми, он уже стал больше :) Итак, те объекты TSam используются для загрузки данных с диска. Один файл в каждом объекте. Они также выполняют некоторую обработку и проверку данных. Для каждого из этих TSam у меня также есть графический объект, который показывает на экране (графически) данные, содержащиеся в объектах TSam. Каждая строка в TStringGrid также показывает данные в TSam, но текстовую.
Один вопрос у меня есть: если я сломаю программу в меньших частях, чтобы узнать, где ошибка, ошибка все равно появится? Или можно появиться только в этой конкретной конфигурации?
Ответ на «как же AsmJob получить назначен TStringGrid, так что TStringGrid разрушает AsmJob, вы можете показать нам?»
MyGrid = TStringGrid
public
AsmJob: TAsmJob;
end;
затем где-то в TForm.Create (форма, которая содержит сетку), я
MyGrid.AsmJob=AsmJob;
и в деструкторе MyGrid я:
begin
FreeAndNil(AsmJob);
inherited
end;
Спасибо, Александр. Я не имел понятия о «ScanMemoryPoolForCorruptions». Я думаю, это функция, предлагаемая FastMM DLL. Я пойду искать его прямо сейчас. – Ampere
Это функция от стандартного FastMM4.pas. Это из полной автономной версии FastMM. Он не существует в версии FastMM, которая интегрирована в Delphi. Здесь нет DLL. Это просто функция в обычном файле pas;) – Alex
К сожалению, ссылка мертва. Но вы можете получить к нему доступ по адресу: http://web.archive.org/web/20091007162116/http://blog.eurekalog.com/?p=198 – EMBarbosa