onq*_*tam 5 valgrind memory-leaks memory-leak-detector leak-sanitizer
阅读完这个 StackOverflow 问题后:直接泄漏和间接泄漏有什么区别?我留下的印象是,如果我修复所有直接泄漏(多次修复测试通过,因为在修复之前的直接泄漏后间接泄漏可能会变成直接泄漏),最终我会得到 0 次泄漏。
我目前正在使用 Leak Sanitizer (LSAN),在修复了所有直接泄漏(因此一些间接泄漏消失了)之后,我现在留下了一堆间接泄漏。为什么没有直接的?这什么时候会发生?如何诊断和修复剩余的泄漏?
它们可能是循环引用。由于间接泄漏可以从其他泄漏块访问,具有循环依赖关系,例如 2 个对象相互引用,并且它们都可能无法从根访问。
例如,在观察者模式中,如果忘记在使用结束时取消注册,很容易保持循环引用(失效监听器问题)。
一般来说,最好避免循环引用。如果从所有权的角度考虑,所有者必须引用其拥有的对象,反之亦然,在这种情况下不可能出现循环依赖。如果通过 constructor 传递依赖项是可以实现的,并且不允许通过 setter 分配依赖项。此外,例如Rust借用引用使循环依赖变得不可能。
| 归档时间: |
|
| 查看次数: |
638 次 |
| 最近记录: |