如何返回对本地分配的struct/object的引用?AKA错误:`foo`的寿命不够长

aij*_*aij 4 pointers rust

这是我正在做的简化示例:

struct Foo ...
impl io::Read for Foo ...

fn problem<'a>() -> io::Result<&'a mut io::Read> {
    // foo does not live long enough, because it gets allocated on the stack
    let mut foo = Foo{ v: 42 };
    Ok(&mut foo)
}
Run Code Online (Sandbox Code Playgroud)

Rust操场就在这里.

显然,问题是foo在堆栈上分配,所以如果我们返回对它的引用,引用会比对象更长.

在C中,您可以通过使用malloc在堆上分配对象来解决此问题,并且调用者需要知道free在适当时调用.在GCed语言中,这只会起作用,因为它foo会一直存在,直到没有引用它为止.Rust非常聪明,介于两者之间,所以我不确定我的选择是什么.

我认为一个选项是返回托管指针类型.是Box最合适的?(我找到了生锈指针的指南,但它已经过时了.)

我返回引用的原因是,实际上我需要返回实现的几个结构中的任何一个Read.我想另一种选择是创建一个枚举来包装每个可能的结构.这样可以避免堆分配,但似乎不必要的尴尬.

还有其他我没有想过的选择吗?

mdu*_*dup 5

Box 编译成功替换引用:

fn problem<'a>() -> io::Result<Box<io::Read>> {
    let mut foo = Foo{ v: 42 };
    Ok(Box::new(foo))
}
Run Code Online (Sandbox Code Playgroud)

  • @aij:您可以借用`&*box`(或者只是`&box`,感谢`Deref`)借用一个盒子的内部来获取一个来自`Box`的借来的指针. (3认同)