(РЕШЕНО) Heaptrc показывает утечку памяти...

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

(РЕШЕНО) Heaptrc показывает утечку памяти...

Сообщение java73 » 03.12.2019 10:45:40

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

P.S. Я постарался максимально объяснить, но если б клал куски кода, то, наоборот, бы запутал только. Там оооочень много.
Последний раз редактировалось java73 03.12.2019 14:50:56, всего редактировалось 1 раз.
java73
постоялец
 
Сообщения: 242
Зарегистрирован: 21.11.2013 09:08:10

Re: Heaptrc показывает утечку памяти, хотя её не должно быть

Сообщение iskander » 03.12.2019 11:06:31

java73 писал(а):Может ли модуль Heaptrc ошибаться

Ни разу пока не сталкивался с такой ситуацией. Желателен все же минимальный пример утечки.
iskander
постоялец
 
Сообщения: 229
Зарегистрирован: 08.01.2012 18:43:34

Re: Heaptrc показывает утечку памяти, хотя её не должно быть

Сообщение olegy123 » 03.12.2019 11:12:30

На сколько я понимаю логику Heaptrc - если в куче есть активные ссылочные части он их показывает.
Вообще он мне здорово помог при написании систем 24/7/365
Сигналил на объекты при удалении Object.Free, при них росла утечка памяти. Когда перешел на FreeAndNil(Object) - все стало ок.
olegy123
долгожитель
 
Сообщения: 1524
Зарегистрирован: 25.02.2016 12:10:20

Re: Heaptrc показывает утечку памяти, хотя её не должно быть

Сообщение java73 » 03.12.2019 14:49:38

Блин))) ошибка как всегда скрывалась в невнимательности. Всё проще: heaptrc молодец, а я вот нет.
Код: Выделить всё
lNice := TNiceClass.Create;
      lNice := TIntel20Context(pContext).ReadNiceClass(Query.FieldByName('ID').AsInteger);
      goodslist.Add(lNice);

В этом коде прекрасно всё...за исключением TNiceClass.Create. Поскольку в следующем методе ReadNiceClass объект также создается.
Задвоение объектов выловил с помощью LazLogger, поставив лог в Сreate/Destroy:
Код: Выделить всё
+ create TNiceClass with ID=0
+ create TNiceClass with ID=2
+++ create a new object TTrademark with ID=1
       Internal list of TtiObjectList free (0 objects)
- destroy TtiObjectList with ID=0
....
- destroy TNiceClass with ID=2
       Internal list of TtiObjectList free (1 objects)

В список попадал второй объект, а первый оставался болтаться в памяти неприкаянный.

Добавлено спустя 2 часа 49 минут 30 секунд:
Re: (РЕШЕНО) Heaptrc показывает утечку памяти...
А ведь два дня потратил.
Написал десяток тестов. Раскидал везде записей в логи. Два листа А4 вручную исписал процессами создания/удаления всех объектов. Обидно, что ошибка была нелепой и никак вообще не связанной с тем местом, где я искал первопричину.
java73
постоялец
 
Сообщения: 242
Зарегистрирован: 21.11.2013 09:08:10

Re: (РЕШЕНО) Heaptrc показывает утечку памяти...

Сообщение zoltanleo » 05.12.2019 18:28:59

java73 писал(а):Обидно, что ошибка была нелепой и никак вообще не связанной с тем местом, где я искал первопричину.

было бы обидно, если не нашел :)
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 333
Зарегистрирован: 17.10.2013 10:55:01


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru