【问题标题】:Only Indirect leaks and no Direct ones只有间接泄漏,没有直接泄漏
【发布时间】:2019-12-20 00:11:33
【问题描述】:

在阅读了这个 StackOverflow 问题后:What is the difference between a direct and indirect leak? 我留下的印象是,如果我修复所有直接泄漏(多次修复测试通过,因为在修复之前的直接泄漏后间接泄漏可能变成直接泄漏)最终我最终会出现 0 次泄漏。

我目前正在使用 Leak Sanitizer (LSAN),在修复了所有直接泄漏之后(一些间接泄漏也因此消失了),我现在留下了一堆间接泄漏。为什么没有直接的?这什么时候会发生?如何诊断和修复剩余的泄漏?

【问题讨论】:

    标签: memory-leaks valgrind memory-leak-detector leak-sanitizer


    【解决方案1】:

    它们可能是循环引用。由于间接泄漏可以从其他泄漏块到达,具有循环依赖性,例如2 个对象相互引用,并且它们都可能无法从根中访问。

    例如在Observer 模式中,如果忘记在使用结束时进行注销(Lapsed listener problem),很容易保持循环引用。

    一般来说最好避免循环引用。如果从所有权的角度考虑,所有者必须具有对其拥有的对象的引用,但反之亦然,在这种情况下循环依赖是不可能的。如果pass dependencies via constructor 是可以实现的,并且不允许通过setter 分配依赖项。还有例如Rust 借用引用使得循环依赖变得不可能。

    【讨论】:

      猜你喜欢
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      相关资源
      最近更新 更多