Когда уничтожаешь созданную через NEW() очередь

AP> 3. Когда уничтожаешь созданную через NEW() очередь — обязательно ли перед
AP> DISPOSE делать FREE()? ANY полей — нет, только обычные STRING/LONG итд

Для очередей оператор Dispose() транслируется компилятором в вызов отдельной функции ядра, предназначенной именно для уничтожения очередей. Так как очередь «изнутри» представляет собой обычный обьект (класс), то для его уничтожения вызывается деструктор этого обьекта. А в числе первых операторов этого деструктора стоит вызов «ядренного» эквивалента оператора FREE(). Разница между этими функциями следующая:

Обычный оператор FREE()

вызывает метод-деструктор для объекта — списка записей очереди.
вызывает метод-деструктор для объектов — ключей очереди.
вызывает метод-конструктор для объекта — списка записей очереди.

метод FREE деструктора очереди

выполняет первые два шага обычного оператора FREE().
вызывает методы-деструкторы для вспомогательных объектов очереди.
освобождает ВСЕ занятые при инициализации области памяти.

Так что, как видно, вызов оператора FREE() перед DISPOSE()
НЕ является необходимым. Спокойно можно обойтись и без него.