MyObject
- это переменная, отличная от поля FMyObject
. И вы только nil
заполняете поле FMyObject
.
FreeAndNil
освобождает объект, на который указывает, и nil
s переменную, которую вы передали. Она не обнаруживает магическим образом и nil
все другие переменные, которые указывают на объект, который вы освободили.
FreeAndNil(FMyObject);
делает то же самое, что и:
object(FMyObject).Free();
FMyObject=nil;
(Технически это не совсем правильно, приведение к объекту является переосмысленным приведением из-за нетипизированного параметра var
, но здесь это не имеет значения)
И это, очевидно, только изменяет FMyObject
, а не MyObject
О, я только что заметил, что вы скрываете оригинальный метод Free
? Это безумие. FreeAndNil
все еще использует оригинал Free
. Это не поразило вас в вашем примере, потому что вы вызываете Free
для переменной со статическим типом TBigObject
, а не FreeAndNil
. Но это квитанция за катастрофу.
Вместо этого вы должны переопределить деструктор Destroy
.