Если вы используете FastMM4 в качестве диспетчера памяти, вы можете проверить, что класс не TFreeObject .
Или, в более стандартном случае, используйте подпрограмму, которая проверит, что ваш объект является тем, о чем он говорит, путем проверки класса VMT .
В течение некоторого времени были такие функции ValidateObj (Рэй Лишнер и Халвард Вассботн: http://hallvards.blogspot.com/2004/06/hack-6checking-for-valid-object.html)
).
Вот еще один:
function ValidateObj(Obj: TObject): Pointer;
// see { Virtual method table entries } in System.pas
begin
Result := Obj;
if Assigned(Result) then
try
if Pointer(PPointer(Obj)^) <> Pointer(Pointer(Cardinal(PPointer(Obj)^) + Cardinal(vmtSelfPtr))^) then
// object not valid anymore
Result := nil;
except
Result := nil;
end;
end;
Обновление: немного осторожности ... Приведенная выше функция гарантирует, что результат будет либо нулевым, либо действительным ненулевым объектом. Это не гарантирует, что Obj по-прежнему остается тем, чем вы думаете, в случае, когда диспетчер памяти уже перераспределил ранее освобожденную память.