Когда Emacs Lisp лексически-позволяет утечка памяти?
Я читал о lexical-let утечке памяти, например здесь:
Есть ли проблемы с лексико-let или другими cl-макросами??? - Список пользователей для текстового редактора GNU Emacs - ArchiveOrange
В нем говорится:
"Обратите внимание, что переменные, связанные с лексико-let, никогда не выпускаются, даже если они никогда не используются. Попробуйте
(loop for i from 1 to 100000 collect (lexical-let ((x i)) '()))
и наблюдайте, как он ел память.
Но я думаю, что этот код ест память только потому, что список, созданный циклом, растет.
Итак, я написал несколько кодов elisp, чтобы проверить, когда это произойдет, но я не смог найти пример утечки.
Это то, как память растет со временем, когда я выполняю код ниже.
![lambda-in-let.el]()
(require 'cl)
(defvar num-loop-1 30)
(defvar num-loop-2 100000)
(loop for i from 1 to num-loop-1 do
(loop for j from 1 to num-loop-2 collect
(lexical-let ((x `(,i ,j))) (lambda () x))))
Похоже, утечки нет.
Подробнее здесь:
https://gist.github.com/1703325
ДОБАВЛЕНО: так выглядит первый пример памяти. Как я уже сказал, я думаю, что это артефакт.
![lambda-in-let.el]()
Ответы
Ответ 1
Я только что нашел это в emacs-devel:
Когда используется emacs Lisp для лексики-утечки памяти? Итак... Это правда, что "переменные, связанные с лексико-let, никогда выпущены, даже если они никогда не используются"?
Не знаю, что знаю. Конечно, этот код не является ошибкой, но я не знаю любого конкретного случая, который сталкивается с такой ошибкой.
- Re: lexical-let вызывает утечку памяти?