更具体地说,为什么
Arc<T>
没有使用动态大小的 T
实现 from_raw
,而 Box<T>
却实现了呢?请参考此处和此处。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
}
(播放)
正如评论所指出的,Arc::from_raw
必须使用 Arc::into_raw
中的指针,因此上面的示例没有意义。我的原始问题 (是否可能从 Vec<T>
创建一个 Arc<[T]>
) 仍然存在:这是可能的吗?如果不是,为什么?
Arc::from_raw
期望一个由Arc::into_raw
返回的指针。尽管如此,from_raw
要求T
具有大小可能会有一个很好的答案。 - E net4let x = Box::new(5);
会导致未定义行为(UB)吗? - JohnArc::from_raw()
只能与从Arc::into_raw()
返回的值一起使用,因为Arc
在数据指针之前放置了一个头部,并且Arc::from_raw
期望通过在您提供的指针之前立即查找该头部来找到它。 - Lily Ballard