【问题标题】:How do I get an owned value out of a `Box`?如何从“盒子”中获得拥有的价值?
【发布时间】:2017-07-04 23:30:17
【问题描述】:

这个函数的实现是什么:

fn unbox<T>(value: Box<T>) -> T {
    // ???
}

文档中唯一看起来像我想要的函数是Box::into_raw。以下将类型检查:

fn unbox<T>(value: Box<T>) -> T {
    *value.into_raw()
}

这给出了错误error[E0133]: dereference of raw pointer requires unsafe function or block。将其包裹在 unsafe { ... } 块中可以修复它。

fn unbox<T>(value: Box<T>) -> T {
    unsafe { *value.into_raw() }
}

这是正确的实现吗?如果是这样,为什么它不安全?什么意思?

也许这个问题显示了我对Boxs 实际工作方式的普遍不确定性。

【问题讨论】:

  • 注意:在您提议的实现中,您正在泄漏由Box 分配的内存。

标签: rust unsafe


【解决方案1】:

取消引用值:

fn unbox<T>(value: Box<T>) -> T {
    *value
}

早在 1.0 之前的 Rust 中,堆分配的值是非常特殊的类型,它们使用符号~(如~T)。在通往 Rust 1.0 的道路上,大部分这种特殊情况都被删除了……但不是全部。

这个特殊的专业被称为“deref move”,并且有一个proto-RFC 支持它作为一流的概念。在那之前,答案是“因为Box 很特别”。

另见:

【讨论】:

猜你喜欢
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 2018-08-06
  • 2020-11-22
  • 1970-01-01
相关资源
最近更新 更多