gpt4 book ai didi

perl - Perl v5.10.1 是否有内存泄漏或如何解释 valgrind

转载 作者:行者123 更新时间:2023-12-04 19:09:15 26 4
gpt4 key购买 nike

我有一个存在内存泄漏的脚本。我相信这是因为在我执行 undef 之后在我的嵌套对象上,脚本中的内存量没有改变。我用过Devel::Cycle找到任何循环引用,我已将这些循环引用转换为具有 Scalar::Util 的弱引用.问题仍然存在。

现在我正在尝试使用 Valgrind 来解决这个问题。作为 valgrind 的第一次开始,我测试了一个 perl hello world 程序:

#! /usr/bin/perl

use strict;
use warnings;

print "Hello world!\n";

这是运行 valgrind --trace-children=yes perl ./hello_world.pl 时的 valgrind 输出:
==12823== HEAP SUMMARY:
==12823== in use at exit: 290,774 bytes in 2,372 blocks
==12823== total heap usage: 5,159 allocs, 2,787 frees, 478,873 bytes allocated
==12823==
==12823== LEAK SUMMARY:
==12823== definitely lost: 13,981 bytes in 18 blocks
==12823== indirectly lost: 276,793 bytes in 2,354 blocks
==12823== possibly lost: 0 bytes in 0 blocks
==12823== still reachable: 0 bytes in 0 blocks
==12823== suppressed: 0 bytes in 0 blocks
==12823== Rerun with --leak-check=full to see details of leaked memory
==12823==
==12823== For counts of detected and suppressed errors, rerun with: -v
==12823== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)

我的理解,来自 here , 是当 allocs 的数量不等于 frees 的数量你有内存泄漏。

由于我所做的只是打印 hello world,我不得不问一个问题,Perl 解释器本身,这里是 v5.10.1,是否至少有它自己的内存泄漏或者我解释的东西都错了?

在处理我的实际 perl 脚本之前,我想了解这一点。

附录

我在 Perl 5.12.0 delta 中看到, 以下:

A weak reference to a hash would leak. This was affecting DBI [RT #56908].



这最终可能适用于我完整的 perl 脚本,而不是这个 hello world 程序,但它让我认为我应该经历以非 root 身份安装最新版本的 perl 的痛苦。

附录2

我安装了 activestate perl 5.16.3,问题以及我实际脚本的问题仍然存在。

我怀疑在这个 hello world 程序的情况下,我必须不正确地使用/解释 valgrind,但我还不明白在哪里。

更新1
Daxim 的回答确实有所作为。当我在我的 perl 脚本中引入以下行时:
use Perl::Destruct::Level level => 1;

那么valgrind的输出是:
==29719== HEAP SUMMARY:
==29719== in use at exit: 1,617 bytes in 6 blocks
==29719== total heap usage: 6,499 allocs, 6,493 frees, 585,389 bytes allocated
==29719==
==29719== LEAK SUMMARY:
==29719== definitely lost: 0 bytes in 0 blocks
==29719== indirectly lost: 0 bytes in 0 blocks
==29719== possibly lost: 0 bytes in 0 blocks
==29719== still reachable: 1,617 bytes in 6 blocks
==29719== suppressed: 0 bytes in 0 blocks
==29719== Rerun with --leak-check=full to see details of leaked memory
==29719==
==29719== For counts of detected and suppressed errors, rerun with: -v
==29719== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)

这是一个很大的区别。我自己的脚本内存泄漏问题仍然存在,但至少这个 hello world 程序现在对 valgrind 来说似乎是明智的。

整个事情虽然引出了一个问题,用 Scalar::Util 停止硬循环引用有什么意义?如果在程序退出之前没有释放内存,则禁止使用这个有点深奥的 Perl::Destruct::Level模块???

最佳答案

泄漏是故意的。 vincent in #p5p评论:

Allocated memory isn't actually released unless PERL_DESTRUCT_LEVEL is set because it's faster to let the operating system handle this. PERL_DESTRUCT_LEVEL is only available for debugging builds or by using Perl::Destruct::Level from perl.

关于perl - Perl v5.10.1 是否有内存泄漏或如何解释 valgrind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17055491/

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