在Perl中,在属性中保留对Catalyst的$c的引用会导致内存泄漏吗?
发布时间:2020-12-15 21:47:01 所属栏目:大数据 来源:网络整理
导读:我开始使用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); $sel
我开始使用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(为什么一直传递$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设置为其他内容的请求时释放,但不会更快.更重要的是,它几乎只是错误的设计.要么继续传递上下文作为参数;或者将您的控制器方法转换为私有操作,并使用 – > forward(自动传递上下文)调用它们;或者在适当的情况下将事物移入模型中,并使用模型ACCEPT_CONTEXT.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |