Когда в Emacs Lisp происходит утечка памяти в лексическом выражении? - PullRequest
12 голосов
/ 30 января 2012

Я читал о лексической утечке памяти, например, здесь: Есть ли какие-либо проблемы с лексическим разрешением или другими макросами 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 Ответ

2 голосов
/ 01 февраля 2012

Я только что нашел это в emacs-devel :

Когда в Emacs Lisp просачивается память лексического типа? Итак ...Правда ли, что «переменные, связанные с лексическим let, никогда не освобождаются, даже если они никогда не используются»?

Не то, чтобы я знал.Конечно, этот код не без ошибок, но я не знаю ни одного конкретного случая, который наталкивается на такую ​​ошибку.

- Re: lexical-let вызывает утечки памяти?

...