Если вы пропускаете 115 экземпляров этого класса, то этот класс пропускается. Память, занятая этим классом, а не память, занимаемая вещами, на которые он ссылается, протекает. Где-то у вас есть 115 экземпляров TCwcBasicAdapter
, которые вы не освобождаете.
Кроме того, свойства не хранят данные, независимо от того, являются ли они интерфейсами или какими-либо другими типами. Только поля занимают память (наряду с некоторым скрытым пространством, которое компилятор выделяет от имени класса).
Итак, да, вы лаете не на то дерево. Ваша утечка памяти где-то еще. Когда FastMM сообщает вам, что у вас есть утечка памяти, он также не сообщает вам, где был выделен каждый экземпляр утечки. У него есть такая возможность; вам может потребоваться настроить некоторые символы условной компиляции, чтобы включить эту функцию.
Конечно, это не только экземпляры этого класса, которые протекают. FastMM также должен сообщать о некоторых других утечках, таких как экземпляры класса или классы, реализующие интерфейс.
Основываясь на добавленной вами функции, я начал подозревать, что на самом деле TCwcCDSAdapterNavBase
протекает, и это может быть из-за нетипичного способа, которым вы его используете. Работает ли обработчик исключений в GetAdapterNav
? Я сомневаюсь; TObject.GetInterface
никогда явно не вызывает исключение. Если объект не поддерживает интерфейс, он возвращает False
. Все, что может обработать исключение, это такие вещи, как нарушение прав доступа и незаконные операции, которые вам действительно не следует ловить в любом случае.
Вы можете реализовать эту функцию более прямо так:
if Assigned(FDataSet) then
Result := TCwcCDSAdapterNavBase.Create(...);