Memory leaks 什么是Rc依赖循环的最小示例?

Memory leaks 什么是Rc依赖循环的最小示例?,memory-leaks,rust,valgrind,Memory Leaks,Rust,Valgrind,我正试图编写一个泄露内存的生锈程序。根据Valgrind的说法,下面的示例似乎应该导致内存泄漏,但没有泄漏内存。有什么好处 test.rs: use std::cell::RefCell; use std::rc::Rc; struct Foo { f: Rc<Bar>, } struct Bar { b: RefCell<Option<Rc<Foo>>>, } fn main() { let bar = Rc::ne

我正试图编写一个泄露内存的生锈程序。根据Valgrind的说法,下面的示例似乎应该导致内存泄漏,但没有泄漏内存。有什么好处

test.rs

use std::cell::RefCell;
use std::rc::Rc;

struct Foo {
    f: Rc<Bar>,
}

struct Bar {
    b: RefCell<Option<Rc<Foo>>>,
}

fn main() {
    let bar = Rc::new(Bar {
        b: RefCell::new(None),
    });
    let foo = Rc::new(Foo { f: bar.clone() });
    *bar.b.borrow_mut() = Some(foo.clone());
}

在您使用的Rust版本中,很可能您使用的是jemalloc,它并不总是能很好地与Valgrind配合使用(有关更多信息,请参阅链接问题)。对于Rust的现代版本,默认情况下使用系统分配器,并且您发布的代码确实报告内存泄漏:

$valgrind--leak check=full./test
==761==Memcheck,内存错误检测器
==761==2002-2017年版权(C)和GNU GPL'd,朱利安·苏厄德等人。
==761==使用Valgrind-3.13.0和LibVEX;使用-h重新运行以获取版权信息
==761==命令:./test
==761==
==761==
==761==堆摘要:
==761==在出口处使用:2个块中有56个字节
==761==总堆使用率:13个alloc,11个free,分配2233个字节
==761==
==761==1个块中的56(32个直接,24个间接)字节肯定会在丢失记录2(共2个)中丢失
==761==at 0x4C2FB0F:malloc(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==761==by 0x10BDAB:alloc::alloc::alloc(in/tmp/test)
==761==by 0x10BD17:alloc::alloc::exchange\u malloc(in/tmp/test)
==761==0x10C3F6:

  • 我认为这篇文章是为Rust 1.0编写的。你的rustc版本是什么?你用rustc
    1.0
    试过了吗?这是令人惊讶的,
    Rc::strong_count(&…
    表明
    Rc
    Rc
    在操作后都有
    2
    的计数,所以仅仅删除堆栈变量就足以泄漏一个周期。我尝试查看生成的LLVM IR,但无法从生成的大量函数中提取任何可以解释此类报告的内容:/I正在使用
    rustc
    version
    1.4
    stable。为清晰起见进行了编辑。你能用Rust 1.0试试吗?也许这个问题在以后的版本中得到了解决。
    use std::cell::RefCell;
    use std::rc::Rc;
    
    struct Node {
        next: RefCell<Option<Rc<Node>>>,
    }
    
    fn main() {
        let foo1 = Rc::new(Node {
            next: RefCell::new(None),
        });
        let foo2 = Rc::new(Node {
            next: RefCell::new(Some(foo1.clone())),
        });
        *foo1.next.borrow_mut() = Some(foo2.clone());
    }