FreeAndNil
вызывает не виртуальный метод Free
. Который сначала проверяет nil
(переменная скорее всего не nil
), а затем вызывает виртуальный деструктор Destroy
.
Вызов виртуального метода означает просмотр начала объекта для получения таблицы виртуальных методов (VMT). Это может привести к нарушению прав доступа. Но если объект находится в выделенной памяти, он вместо этого возвратит неопределенный указатель как VMT.
Затем значение размера указателя считывается с определенным смещением от VMT. Это еще раз может вызвать нарушение прав доступа или вернуть неопределенный указатель.
Наконец, память, на которую указывает этот указатель. И если он содержит недопустимый код, вы получаете вариант недопустимого исключения инструкции.