{};
$a->{func} = sub {
$a->{cnt}++;
};
}
Тут есть утечка - почему и как поправить?
Циклическая ссылка?
Да и как это разорвать так, чтобы не потерять работоспособность кода.
На что?
Передать cnt, все скаляры указатели
Часть ссылок не должна считать дочерние ссылки
Так неудобно-же. Прдставь что счетчиков 100500
Об этом заботится интерпретатор.
Нет. Тут должен заботиться ты.
Ээээ, слюшай, я языком с динамическим выделением памяти вашпе нэ для это занималса
эээ а как перл следит за памятью?
Да зачэм это? Как хочет, таа и следит. )
Сорри, а это вообще идиоматично присваивать замыкание члену словаря? Прост я в питоне ни разу не встречал, чтобы замыкание (кроме декораторов, но там тоже проблем на практике не возникает) становилось методом обьекта Точнее вопрос, проблема с утечкой в замыканиях, это проблема перла, или в других языках так же
Так в том и соль чтобы замкнуть весь словарь (хотя тут объект). Проблема в том что замыкание кладется в сам объект и возникает циклическая ссылка
В нормальных языках это асан найдет и отстрелит
Кхм, а если что, это так-то прототип ООП.
weaken $a->{func} так норм?
почему?
use Scalar::Util "weaken"; while (1) { my $a = {}; $a->{func} = sub { $a->{cnt}++; }; weaken $a; } а тут какие минусы ?
Запусти. Утечка останется
Лол, тебе не понятно что ли?
Ты попробуй вызвать func :) и потом для наглядности посмотри, что будет в $a
Обсуждают сегодня