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

Posted

技术标签:

【中文标题】使用 destroy() 命令时的 Perl/Tk 内存泄漏【英文标题】:Perl/Tk Memory Leak When Using destroy() Command 【发布时间】:2013-01-02 17:31:05 【问题描述】:

我遇到了一个问题,即在 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;

【问题讨论】:

真的吗?没有人对这个问题有任何想法吗? 【参考方案1】:

是的,这是众所周知的。 Perl/Tk系统在销毁widget的时候有一些遗留问题(其实不是Perl的错,而是Perl/Tk子系统的错)。

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

【讨论】:

以上是关于使用 destroy() 命令时的 Perl/Tk 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

Perl-Tk入门教程 - 创建一个窗口

在网页中运行 Perl/TK GUI

perl tk将界面输入的汉字不能输出到读取的EXCEL表格

Perl Tk在IC设计中的应用WindowsLinux平台下的安装-各种错误的摸索解决

在struct中访问函数时的段错误

编译的 Perl GUI 应用程序