пятница, 7 сентября 2018 г.

[AutoLISP] - Куда уходит память?

При разработке приложения на AutoLISP столкнулся с утечкой памяти. На тестах под нагрузкой сжиралась вся оперативная память (всего - 16 Гб).
Запуск сборщика мусора не помог, все переменные проекта проверил, всё в порядке.
При отладке выявил, что виновником утечки памяти является функция 
vlax-ename->vla-object

После безуспешных попыток найти решение помог уже не раз выручавший меня способ: последовательное чтение списка всех функций. 
В книге "Autolisp и Visual Lisp в среде AutoCAD" есть очень удобное приложение - в одну таблицу собраны все функции и методы, сначала пробежался по ней, но безуспешно. Пошёл шерстить всю книгу и нашёл метод получения vla-объекта по хэндлу примитива HandleToObject

Ну а дальше дело техники - забираем хэндл из DXF-данных примитива и по нему получаем vla-object:

(defun kha_vlax-ename->vla-object (e doc)
  (vla-HandleToObject doc (cdr (assoc 5 (entget e)))))

Удачи!

Комментариев нет:

Отправить комментарий