【发布时间】:2017-10-13 01:57:32
【问题描述】:
更具体地说,为什么 doesn't Arc<T> 使用动态大小的 T 而实现 from_raw 而 Box<T> does?
use std::sync::Arc;
fn main() {
let x = vec![1, 2, 3].into_boxed_slice();
let y = Box::into_raw(x);
let z = unsafe { Arc::from_raw(y) }; // ERROR
}
(play)
正如 cmets 中所指出的,Arc::from_raw 必须与来自 Arc::into_raw 的指针一起使用,因此上面的示例没有意义。我最初的问题(Is it possible to create an Arc<[T]> from a Vec<T>)仍然存在:这可能吗,如果不是,为什么?
【问题讨论】:
-
也许这是件好事:如果编译该代码,它将是 UB,因为
Arc::from_raw期望Arc::into_raw返回一个指针。不过,from_raw需要T调整大小的部分可能会有一个很好的答案。 -
@E_net4 真的吗?那么,在示例中写
let x = Box::new(5);将是UB? -
请注意,
Arc::from_raw()只能与从Arc::into_raw()返回的值一起使用,因为Arc在数据指针之前放置了一个标头,而Arc::from_raw期望通过紧接之前查找来找到该标头您提供的指针。
标签: rust