只有间接泄漏,没有直接泄漏

Only Indirect leaks and no Direct ones

阅读完这个 Whosebug 问题后: 我留下的印象是,如果我修复所有直接泄漏(多次修复测试通过,因为在修复前一个直接泄漏后,间接泄漏可能会变成直接泄漏泄漏)最终我会得到 0 个泄漏。

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

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

例如在 Observer pattern, it's easy to keep circular reference if forget to do a deregistration at the end of usage (Lapsed listener problem).

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