使用destroy()命令时Perl / Tk内存泄漏

时间:2013-01-18 22:13:10

标签: memory-leaks destroy perltk

我遇到了在Unix上运行Perl / Tk时出现大量泄漏的问题。由于某些限制,我无法发布大部分代码,但我已经能够确定导致内存泄漏的原因并创建一个具有相同症状的小程序。基本上我正在运行一个GUI,其中框架被销毁并定期重新填充。这似乎会导致大量内存泄漏,但仍在不断增长。我认为destroy命令会消除内存中的所有痕迹,但它似乎并不是那样。我对Perl中的垃圾收集也不太熟悉。该程序将一次运行数天或数周,因此内存泄漏并不理想。有没有人有任何想法来阻止内存泄漏?我被限制使用Perl,所以不幸的是我不能轻易地将代码移植到Python或其他东西。提前感谢您的帮助。

#!opt/project/COTS/bin/perl
use strict;
use warnings;
use Tk;

$Tk::mw = MainWindow->new;
$Tk::mw->repeat(10,\$build);
my $status;
&build;

sub build{
    $status->destroy() if ($status);
    $status = $Tk::mw->Frame->pack(-side => 'top');

    my $left_frame = $status->Frame(
        -relief =>'sunken',
        -borderwidth => 1
    )->pack(-side => 'left', -anchor => 'nw', -padx => 4, -pady => 5);

    my $right_frame = $status->Frame(
        -relief =>'sunken',
        -borderwidth => 1
    )->pack(-side => 'left', -anchor => 'nw', -padx => 4, -pady => 5);

}
MainLoop;

1 个答案:

答案 0 :(得分:0)

是的,这是众所周知的。在销毁小部件时,Perl / Tk系统中有一些剩余物(实际上它不是Perl的错误,而是Perl / Tk子系统的错误)。

最好的方法是重用小部件。大多数情况下这是可能的,因为您可以重新配置所有选项。如果某些子窗口小部件即将消失并重新出现,则可以使用packForget()暂时将其从显示中删除,然后再次使用pack()使其可见。