2

我在 Unix 上运行的 Perl/Tk 中存在大量泄漏问题。由于某些限制,我无法发布大部分代码,但我已经能够确定导致内存泄漏的原因并创建了一个具有相同症状的小程序。基本上,我正在运行一个 GUI,其中一个框架被破坏并定期重新填充。然而,这似乎会导致大量内存泄漏并不断增长。我以为销毁命令会清除内存中的所有痕迹,但似乎并非如此。我也不太熟悉 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;
4

1 回答 1

0

是的,这是众所周知的。Perl/Tk 系统在销毁小部件时会出现一些遗留问题(实际上不是 Perl 的错,而是 Perl/Tk 子系统的错)。

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

于 2013-07-04T08:16:13.533 回答