rust - 我怎样才能退回盒装值(value)?

标签 rust heap-memory

我基本上有一个函数可以创建一些需要在堆上分配的对象。我想要做的是从该函数返回一个包含对该堆分配值的引用的结构。

struct Cont<'a> {
    pub v: &'a i32
}

impl<'a> Cont<'a> {
    fn new(v: &'a i32) -> Cont {
        Cont {
            v: v
        }
    }
}

fn f<'a>() -> Cont<'a> {
    let v = Box::new(6);

    Cont::new(&v)
}

fn main() {
    let c = f();

    println!("{}", c.v);
}

我收到错误:'v' does not live long enough

您可以找到示例 here .

最佳答案

您不能返回仅包含指向您的对象的借用指针的结构,因为您的 Box 将在函数结束时被销毁。

您需要将 Box 的所有权转移到函数之外,以便堆分配的对象保持事件状态。最简单的方法是将 Box 移动到您的结构中:

struct Cont {
    pub v: Box<i32>
}

impl Cont {
    fn new(v: Box<i32>) -> Cont {
        Cont {
            v: v
        }
    }
}

fn f() -> Cont {
    let v = Box::new(6);
    Cont::new(v)
}

fn main() {
    let c = f();

    println!("{}", c.v);
}

如果您想要一个能够存储借用指针或拥有的Box(或其他类型的智能指针)的结构,我们可以使它在Borrow 上通用。特质。

use std::borrow::Borrow;

struct Cont<T> where T: Borrow<i32> {
    pub v: T
}

impl<T> Cont<T> where T: Borrow<i32> {
    fn new(v: T) -> Cont<T> {
        Cont {
            v: v
        }
    }
}

fn owned() -> Cont<Box<i32>> {
    let v = Box::new(6);
    Cont::new(v)
}

fn borrowed(v: &i32) -> Cont<&i32> {
    Cont::new(v)
}

fn main() {
    let c = owned();
    println!("{}", c.v);

    let x = 123;
    let c = borrowed(&x);
    println!("{}", c.v);
}

关于rust - 我怎样才能退回盒装值(value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35341523/

相关文章:

rust - 动态闭包 Vec 的错误类型推断

rust - _ 在 Rust 中的类型错误中意味着什么?

rust-lld 丢失了,我该如何安装它?

android - Android 平台中的自定义堆大小?

c - 如何使用在堆上实现的堆栈将程序集转换为 C?

c - 调用 exec(3) 实现细节时是否释放了内存?

rust - 如何在 Rust 2018 中惯用地为箱子起别名?

rust - std::fs::canonicalize 不存在的文件

char *p =NULL 占用内存?

reactjs - 打包时如何减少 React 应用程序构建时间和理解 webpack 的行为