gpt4 book ai didi

perl - 在 Perl 中,在属性中保留对 Catalyst 的 $c 的引用会导致内存泄漏吗?

转载 作者:行者123 更新时间:2023-12-04 17:23:45 24 4
gpt4 key购买 nike

我开始使用 Catalyst 编写一些 Perl 代码,如下所示:

package My::Controller;
extends 'Catalyst::Controller';

sub handler :Path :Args(0) :Location( some/url )
my ($self, $c) = @_;

$self->do_something_with_arguments($c);
$self->make_a_decision($c);
$self->another_method($c);
}

然后我想。 o O(为什么总是传递 $c ?),我改为:
package My::Controller;
extends 'Catalyst::Controller';

has c => (is => "rw", isa => "Catalyst");

sub handler :Path :Args(0) :Location( some/url )
my ($self, $c) = @_;
$self->c($c);

$self->do_something_with_arguments;
$self->make_a_decision;
$self->another_method;
}

处理程序只有一个入口点,因此 $self->c 将始终正确设置。

我的同事说,如果这就是 Catalyst 的用途,那么,每个人都会这样使用它。他们担心这样做会导致内存泄漏,因为对 $c 的引用会在请求结束后持续存在。真的吗?

最佳答案

这并不是大多数人所认为的确切意义上的“内存泄漏”,因为它不会导致无限的内存增长,但是是的,您将请求上下文保持在比其正常生命周期更长的时间。下次您发出设置 $self->c 的请求时,它将被释放。到别的东西,但不是更早。更重要的是,这几乎只是错误的设计。继续将上下文作为参数传递;或将您的 Controller 方法转换为私有(private)操作并使用 ->forward 调用它们(自动传递上下文);或在适当的情况下将事物移入模型中,并使用模型 ACCEPT_CONTEXT .

关于perl - 在 Perl 中,在属性中保留对 Catalyst 的 $c 的引用会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14814976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com