更具體地說,爲什麼doesn'tArc<T>
實施from_raw
動態大小T
而Box<T>
does?是否可以從Vec <T>創建Arc <[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
}
(play)
如在評論中指出,Arc::from_raw
必須與來自Arc::into_raw
指針所使用的,所以上面的示例中是沒有意義的。我原來的問題(是否有可能從Vec<T>
創建一個Arc<[T]>
)仍然存在:這是可能的,如果沒有,爲什麼?
也許這是一件好事:如果編譯代碼,它會是UB,因爲'Arc :: from_raw'需要一個由'Arc :: into_raw'返回的指針。儘管如此,'from_raw'需要'T'的部分可能會有很好的答案。 –
@ E_net4真的嗎?然後,寫'let x = Box :: new(5);'而不是在這個例子中是UB? – John
請注意,'Arc :: from_raw()'只能與從'Arc :: into_raw()'返回的值一起使用,因爲'Arc'在數據指針前放置了一個頭部,'Arc :: from_raw'希望找到通過在您提供的指針之前立即查看該標題。 –