防止 Perl 中的循环引用内存泄漏

2023-12-20

我最近问了一个question https://stackoverflow.com/questions/31971633/perl-memory-management-when-overwriting-objects关于 Perl 中的覆盖对象和内存管理。我收到的答案之一通知我,我最近编写的脚本可能有问题。

我有一个脚本,其中包含一些非常复杂的数据结构,其中有很多parent->child / child->parent关系。这也意味着有许多对象具有循环引用。根据这个答案 https://stackoverflow.com/questions/31971633/perl-memory-management-when-overwriting-objects/31974608#31974608、循环引用如果处理不当,会“欺骗”Perl的引用计数机制,导致内存泄漏。


循环引用的示例:

       +-----------------------------------------------------+
       |                                                     |
       +-->+============+    +==========+                    |
           [ Reference ----->[ Blessed  ]                    |
$parent -->+============+    [ Hash     ]                    |
                             [          ]   +==========+     |
                             [ children --->[ Array    ]     |
                             [          ]   [          ]     |
                             +==========+   [ 0: ---------+  |
                                            [          ]  |  |
                                            +==========+  |  |
                                                          |  |
       +--------------------------------------------------+  |
       |                                                     |
       +-->+============+    +==========+                    |
           [ Reference ----->[ Blessed  ]                    |
$child --->+============+    [ Hash     ]                    |
                             [          ]                    |
                             [ parent: ----------------------+
                             [          ]
                             +==========+

(免责声明——这不是我的史诗般的艺术作品——感谢@Ikegami 这个可爱的 ASCII 图!)

Problem:每个对象都有对另一个对象的引用。 。 。这意味着一旦$parent and $child超出范围,Perl 的引用计数器仍然认为对每个对象的引用都存在,因此内存永远不会被释放。您最终会在内存中得到两个对象,而无法访问其中任何一个的数据!


我的问题是:处理循环引用以确保 Perl 正确处理其清理的正确方法是什么?当对自引用对象的所有外部引用都被消除时,如何确保 Perl 不会留下任何片段?


Scalar::Util http://search.cpan.org/perldoc?Scalar::Util#weaken特别是weaken功能。

左值 $ref 将变成弱引用。这意味着它不会保留其引用的对象的引用计数。此外,当该对象的引用计数达到零时,该引用将被设置为 undef。该函数会改变作为其参数传递的左值,并且不返回任何值。

将一个或两个参考设置为“弱”,当锚被破坏时,菊花链将自动解开。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止 Perl 中的循环引用内存泄漏 的相关文章

  • 信息隐藏和封装有什么区别?

    两者有什么区别信息隐藏 and 封装 我读到封装意味着将数据和对它们进行操作的过程捆绑在一起 如果是这样 下面的类是否实现了封装 class IsThisEncapsulation public int age public int get
  • Java Thread.sleep 泄漏线程?

    因此 我继承了一些等待来自网络源的通信的代码 当它等待来自网络套接字的更多数据时 Thread sleep 10 叫做 这似乎导致了线程泄漏 正如 jconsole 和我的线程转储所报告的那样 Thread 68 Thread 385 等有
  • 阶级等级制度中频繁的贬低总是邪恶的吗?

    据我所知 如果在类层次结构中频繁使用向下转型是没有好处的 我同意这一点 但是这条规则有哪些例外情况 如果有的话 这就是我的图形编辑器设计的薄弱之处 我有两个层次结构 其中几何图形层次结构与图形基元分离 像这样 public class Ge
  • Python:如何“杀死”类实例/对象?

    我希望 Roach 类在达到一定量的 饥饿 时 死亡 但我不知道如何删除该实例 我的术语可能有误 但我的意思是 窗户上有大量 蟑螂 我希望特定的蟑螂完全消失 我会向您展示代码 但它很长 我将蟑螂类添加到策划者类蟑螂种群列表中 一般来说 每个
  • 如何限制受保护的成员只能从第一级子 C# 访问

    我有3个级别的课程 TopClass MiddleClass BottomClass And MiddleClass源自TopClass and BottomClass源自MiddleClass 我想在以下地区拥有房产TopClass只能从
  • 如何在 Perl 中找到正则表达式匹配的位置?

    我需要编写一个接收字符串和正则表达式的函数 我需要检查是否有匹配并返回匹配的开始和结束位置 正则表达式已经由qr 该函数还可能收到一个 全局 标志 然后我需要返回所有匹配的 开始 结束 对 我无法更改正则表达式 甚至无法添加 用户可能使用的
  • 值类型如何实现引用类型

    我遇到了一个值类型正在实现 ref 的场景 类型 只是想知道这怎么可能 幕后发生了什么 结构体是值类型 接口是引用 类型但结构可以实现接口而不会出现任何错误 有什么想法吗 提前致谢 实际上 它同时以两种不同的方式进行 首先 任何值类型都可以
  • IE 6 中存在内存泄漏的大型 Web 应用程序

    我有一个巨大的网络应用程序在 IE 6 中存在内存泄漏问题 修复演示该问题的 5 行代码示例中的内存泄漏很容易 但如果我有一个非常庞大的应用程序 应该从哪里开始呢 查看Drip http sourceforge net projects i
  • 为什么永久代空间不断增长?

    我读过几篇文章 我理解以下内容 如果我错了 请纠正我和 或编辑问题 java堆是这样分段的 年轻代 创建的对象放在这里 这部分被频繁且廉价地垃圾收集 老一代 在年轻代的垃圾收集中幸存下来的对象会移到此处 该区域的垃圾收集频率较低 并且使用对
  • 如何使用 Perl 和正则表达式将 SQL 文档转换为 ColdFusion 脚本?

    我需要将 SQL 语句文档转换为 ColdFusion 文档 我对正则表达式只有一点经验 而且我是 Perl 超级新手 我昨天刚刚自学了它的基础知识 所以我可以完成这项任务 我正在尝试用 Perl 编写的脚本匹配和替换模式 该脚本保存为 B
  • 在 javascript 原型事件处理程序中保留“this”引用[重复]

    这个问题在这里已经有答案了 正确的保存方法是什么this存储在对象原型内的事件处理程序中的 javascript 引用 我不想创建像 this 或 that 这样的临时变量 而且我不能使用像 jQuery 这样的框架 我看到很多人谈论使用
  • 如何在 Perl 中发送此 SOAP XML?

    我必须发送下面的 XML 我有no idea从哪儿开始 我知道我需要在 Perl 中查找 SOAP 但大致就是这样
  • 我可以在 VIM 或 Perl 中替换单个正则表达式中的多个项目吗?

    假设我有字符串 The Quick Brown Fox Jumps Over the Lazy Dog 我可以用一个正则表达式将其更改为 The Slow Brown Fox Jumps Over the Energy Dog 吗 目前 我
  • 如何使用 Perl 在 Unix 中获取文件创建时间

    如何使用 perl 在 unix 中获取文件创建时间 我有这个命令显示文件的最后修改时间 perl MPOSIX le print strftime d b Y H M localtime lstat 9 for ARGV file txt
  • “foreach”循环中会发生什么样的本地化?

    来自 perldocperlsyn http perldoc perl org perlsyn html Foreach Loops关于 Foreach 循环的主题 如果变量之前是 用 my 声明 它使用 变量而不是全局变量 但它仍然局限于
  • 使用 sed 替换复杂模式

    我想使用 sed 命令替换模式 要删除的图案如下所示 带有一个空格 var 0xaae8 x6A x6F x69 x6E x72 x65 x76 x65 x72 x73 x65 x73 x70 x6C x69 x74 x3E x74 x70
  • 如何强制 Perl 按需重新编译使用“/o”编译的正则表达式?

    技术问题 给定一个正则表达式 my regEx qr whatever myVar oxi Notice o for compile once 强制重新编译的最有效方法是什么一经请求 例如 当我从程序逻辑中知道 myVar值改变 而不下降
  • 对多个属性使用一种设置方法 MATLAB

    我有几个属性基本上使用相同的属性set method classdef MyClass properties A B end methods function mc MyClass a b Constructor mc A a mc B b
  • 在 Perl 中确定范围重叠的最快方法

    我有两组范围 每个范围都是一对整数 开始和结束 表示单个较大范围的某些子范围 两组范围的结构与此类似 当然 将替换为实际数字 a ranges a 1 gt start gt end gt a 2 gt start gt end gt a
  • 零垫重命名,例如图片 (2).jpg -> 图片 (002).jpg

    我需要按照标题在所有子文件夹中解释的方式重命名所有图像 我正在考虑用正则表达式提取括号内的数字 然后重命名它 搜索周围我看到有类似的工具rename and mmv但我无法让他们重新命名 jpg 我将不胜感激任何解决我的问题的建议 顺便说一

随机推荐

  • Spark 执行有时会卡在 Exchange.scala:44 的 mapPartitions 处

    我正在运行一个Spark两节点独立集群上的作业 v 1 0 1 Spark执行经常卡在任务mapPartitions处Exchange scala 44 这发生在我工作的最后阶段 打电话给saveAsTextFile 正如我对 Spark
  • Java 注释中的 /** 和 /*

    有什么区别 comment and comment 在Java中 我什么时候应该使用它们 第一种形式称为Javadoc http en wikipedia org wiki Javadoc 当您为代码编写正式的 API 时 可以使用它 这些
  • F# 中的列表理解与高阶函数

    我有SML背景 对高阶函数感觉很舒服 但我真的不明白列表理解的想法 是否存在列表理解比高阶函数更适合的情况List反之亦然 我听说列表理解比高阶函数慢 在编写性能关键函数时我应该避免使用它吗 为了举例 请看一下在 F 中高效投影列表列表 h
  • SQL Server通过脚本管理列描述

    有没有办法通过脚本更改 更新和删除 删除列描述 I use sp addextendedproperty添加描述 但不允许更新 当我尝试使用相同的 sp 更新现有描述值时 它会显示类似 描述属性已存在 之类的内容 改变或删除 创建类似的解决
  • RecyclerView.Adapter 内的 onActivityResult 未使用

    我在适配器内有一个按钮 可以进入画廊 MyAdapter extends RecyclerView Adapter
  • 自定义数据类型在设备之间不同步

    我正在尝试使用 Google Fit API 来存储自定义数据类型 我可以在单个设备上很好地插入和检索它们 但是当我在不同设备上登录同一个 Google 帐户时 数据不存在 我可以从每个设备创建和检索数据 但它们都保留自己的数据 并且不通过
  • 更改 matplotlib pyplot 图例中线条的线宽[重复]

    这个问题在这里已经有答案了 我想更改 pyplot 图例中的线条样本的厚度 宽度 图例中的线样本的线宽与它们在图中表示的线相同 因此 如果线y1 has linewidth 7 0 图例对应的y1标签上也会有linewidth 7 0 我希
  • 启动没有控制台窗口的程序(在后台)

    我想在 Windows 启动时启动一个简单的程序 但我不想显示与该程序关联的控制台输出窗口 只是为了测试 该程序可以简单如下 int main int argc char argv while 1 printf hello world n
  • 为什么 PHP 中 65.6*100%10 等于 9 而不是 0?

    echo 65 7 100 10 0 echo 65 6 100 10 9 lt echo 6560 10 0 echo 65 5 100 10 0 有人可以解释一下为什么吗 EDIT 对于人类或非程序员来说 结果 9 显然是错误的 我怎样
  • 在 Outlook html 电子邮件中,浮动不起作用

    我想要这样的布局 其中有一个矩形框 左边的盒子里有一个文本 右边有一个图像 这在浏览器中看起来很好 但是当作为 html 电子邮件发送时 在 Outlook 中浮动权限似乎不起作用 它将图像放在文本下方的下一行 关于如何实现这项工作有什么想
  • html 表格如何通过更改悬停时的边框来突出显示列?

    我正在探索如何设计表格样式 以便当鼠标悬停在列上时可以更改边框 当鼠标悬停在一列上时 我想通过更改边框颜色来突出显示该列 需要强调的是 我将以下 JavaScript 代码与 jQuery 库结合使用 td hover function v
  • 构造函数:默认参数和委托参数之间的区别

    今天 我偶然发现这些标准声明 http en cppreference com w cpp container vector vector of std vector构造函数 until C 14 explicit vector const
  • 如何使用 pip 将 vcs 中的 Python 包可编辑安装到特定目录中?

    默认情况下 pip 安装editable打包成srcPython安装目录的子目录 我想使用 pip 支持从源代码控制中检出软件包 将版本控制中的软件包安装到我选择的目录中 例如 pip install e git https github
  • HATEOAS 中“_embedded”的含义和用法

    我正在使用 Spring Data REST 它支持 HATEOAS 我对这个范式很陌生 In GET来自我的 RESTful Web 服务的响应 我经常在名为的节点内收到结果 embedded 我在想 what is embedded节点
  • JPanel 在 JFrame 上没有改变

    我的想法是拥有一个 全局 JFrame 然后我可以根据需要添加 删除 JPanel 以创建一个流畅的应用程序 目前 当我尝试从第一个 JPanel 更改为第二个 JPanel 时 第二个 JPanel 将不会显示 我的代码如下 处理程序 运
  • 计算每个段落中的字符数

    我正在尝试找到一种方法来计算页面上每个段落中的字符数 我发现下面这个小片段可以计算每个段落中的单词数 效果很好 是否可以修改为也包括字符数 互联网上有很多解决方案 但它们只关注特定的字符串或文本区域 并且往往变得非常长和复杂 我不介意计数中
  • 使用默认值从 Mac 上的命令行修改 Plist

    有谁知道如何使用命令行修改 Plist 文件defaults 目前有两个词典URL types大批 我需要添加另一个 我尝试过的每个命令要么替换了整个字典 要么创建了一个名为的新数组URL types而不是编辑它 关于如何在默认情况下完成此
  • 如何检测数据集中的所有空列并删除\删除它们?

    正如标题中所建议的 我想删除所有空列 变量 其中所有记录均为空或等于 null 或 以减少以后执行的时间成本 详细场景 我有一个包含 1000 列的 dataset 其中一些 很多是空的 现在我想创建一个新的数据集 其中需要在先前数据集的某
  • 如何存储由 std::unique_ptr 给出的抽象类的对象向量?

    我有一个循环 其中我使用一个函数将 std unique ptr 返回到抽象类的对象 我想通过push back将这些对象存储到std vector中 但由于对象是抽象类型 我收到以下错误 error cannot allocate an
  • 防止 Perl 中的循环引用内存泄漏

    我最近问了一个question https stackoverflow com questions 31971633 perl memory management when overwriting objects关于 Perl 中的覆盖对象