Всем привет.
Может ли модуль Heaptrc ошибаться в такой ситуации?
В приложении последовательно создаются множество объектов. Сначала создается крупный объект - менеджер, в нем все остальные объекты при создании добавляются в свой список объектов. Менеджер владеет всеми списками объектов.
1) Один объект А из какого-либо списка может содержать ассоциации на другие объекты Б из других списков. Поэтому, когда первый объект А удаляется, в его деструкторе не вызывается метод Free объекта Б, а полю, ассоциированному с этим объектом, присваивается nil.
2) Также объект А может содержать список, в который ассоциированы множество объектов Б. Поскольку объекты Б входят уже в список менеджера, список объекта А создается со свойством ownobjects:=false. Т.е. при удалении списка из объекта А не происходит удаление входящих в него объектов. Вместо этого в деструкторе объекта А список объектов Б очищается (метод clear) и удаляется (free).
При завершении в деструкторе менеджера все списки удаляются, соответственно все входящие в них объекты также освобождают память.
================
Модуль Heaptrc НЕ показывает утечек в ситуации 1, т.е. когда есть ассоциации отдельных объектов.
Однако в ситуации 2 он начинает орать, что есть неосвобожденные куски памяти. Я уже на листе нарисовал всю последовательность создания всех объектов, всех списков и удаления их. Не вижу пробелов... Может ли быть это ошибкой? Или все-таки я мог что-то забыть.
В примере, в котором Heaptrc уже начинает орать, объект А создает список объектов Б, в который добавляется всего один объект Б (также он добавляется в список менеджера). При завершении объект А удаляется (список объектов Б внутри него очищается и удаляется), затем менеджер удаляет все списки, включая объекты А и Б. Не должно быть не удаленных объектов, но Heaptrc все равно орёт.
P.S. Я постарался максимально объяснить, но если б клал куски кода, то, наоборот, бы запутал только. Там оооочень много.