FastMM4 говорит, что “Заголовок блока был поврежден”

Проверьте Время Joda и его Причудливое Средства форматирования .

, Java 8 включает JSR-310 так, чтобы могло быть решение также.

5
задан Alex 31 July 2009 в 12:55
поделиться

3 ответа

Эта ошибка означает, что ваш код повредил структуры диспетчера внутренней памяти. Ваш стек вызовов представляет собой точку, когда MM обнаружил это. Это не путь ошибки или что-то с ним связанное. Фактическая ошибка происходит ДО этого момента. Это может быть связано или не быть связано с упомянутыми классами.

Вам следует попробовать использовать опцию «Ошибки проверки диапазона» (не забудьте сделать Build, а не Compile) и FastMM в режиме полной отладки (с CheckHeapForCorruption, CatchUseOfFreedInterfaces и DetectMMOperationsAfterUninstall параметры включены) .

Вы также можете включить глобальную переменную FullDebugModeScanMemoryPoolBeforeEveryOperation, чтобы получать сообщение об ошибке почти сразу после возникновения проблемы, но этот параметр значительно замедляет выполнение.

Вероятно, лучший выбор - периодически вызывать ScanMemoryPoolForCorruptions . Назовите это в одном месте. Есть ошибка? Назови это раньше. Все еще есть ошибка? Назови это раньше снова. Нет ошибок? Ваша проблема находится где-то между этими последними звонками. Теперь вы можете использовать переменную FullDebugModeScanMemoryPoolBeforeEveryOperation, чтобы получить точное местоположение. Просто включите его только в этой области кода и выключите сразу после него.

Есть очень похожая ошибка: «FastMM обнаружил, что блок был изменен после освобождения». В этом случае ваш код изменяет не внутренние структуры, а другую память, которая вообще не используется («свободная память»).

Кстати, ваша ошибка НЕ ​​устраняет двойное освобождение! Если это вызов с двойным освобождением, FastMM явно сообщит вам, что (это легко обнаружить, поскольку вы пытаетесь освободить неиспользуемый или несуществующий блок памяти): «Была сделана попытка освободить / перераспределить нераспределенный блок ».

который вообще не используется («свободная память»).

Кстати, ваша ошибка НЕ ​​устраняет двойную ошибку! Если это вызов с двойным освобождением, FastMM явно сообщит вам, что (это легко обнаружить, поскольку вы пытаетесь освободить неиспользуемый или несуществующий блок памяти): «Была сделана попытка освободить / перераспределить нераспределенный блок ».

который вообще не используется («свободная память»).

Кстати, ваша ошибка НЕ ​​устраняет двойную ошибку! Если это вызов с двойным освобождением, FastMM сообщит вам, что явно (это легко обнаружить, поскольку вы пытаетесь освободить неиспользуемый или несуществующий блок памяти): «Была сделана попытка освободить / перераспределить нераспределенный блок ».

14
ответ дан 18 December 2019 в 07:31
поделиться

Пара вещей, и я спрашиваю, потому что не вижу ваш код.

Учитывая следующий код:

procedure TForm1.FormCreate(Sender: TObject);
var
   wObjLst : TObjectList;
begin
   wObjLst := TObjectList.Create;
   try
      wObjlst.OwnsObjects := true;
      wObjlst.Add(TPersistent.Create);
      wObjlst.Add(TPersistent.Create);
   finally
      freeandnil(wObjlst);
   end;
end;

Это работает без ошибок.

Вы заявляете that

Во время выполнения форма создает TStringGrid, а затем AsmJob, который создает эти два объекта SAM (и загружает данные с диска в каждый из их). AsmJob также назначается сетке. Когда форма уничтожена, Grid заботится о AsmJob, освобождая его, что освобождает TSam объекты. Вот в чем проблема: первый объект освобожден без проблем. но второй умирает, когда его унаследованный метод (в Destroy destructor).

Мой первый вопрос: как AsmJob назначается TStringGrid, чтобы TStringGrid уничтожил AsmJob, вы можете нам показать?

Во-вторых, зачем создавать потомка TObjectList, чтобы он хранил два объекты, а затем бесплатно освободить их вместо того, чтобы создавать их самостоятельно и позволить TObjectList уничтожить их, как показано выше.

Другой способ - загрузить полный пакет FastMM4 с fastmm.sourceforge.net , установить и используйте dll fulldebug, чтобы точно определить, какой объект выходит из строя. Мы с вами предполагаем, что это один из объектов SAM, а может и нет.

1
ответ дан 18 December 2019 в 07:31
поделиться

A block header getting corrupted usually means something's been overwriting memory, usually by doing some sort of unsafe operation. Are you using raw pointers or assembly code in any of your tasks? Also, if you have range checking and bounds checking turned off, try turning them on and rebuilding. They can help catch a lot of this sort of problem.

4
ответ дан 18 December 2019 в 07:31
поделиться
Другие вопросы по тегам:

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