2016-09-05 25 views
1

我想暴露一個「動態數組」到C函數。 C函數將擁有數據,稍後將調用我的函數來釋放數據。所以它會看起來像下面這樣:如何將一個盒裝切片(`Box <[T]>`)傳遞給C函數?

fn get_something(len: *mut usize) -> *mut u8; 
fn dealloc_something(data: *mut u8, len: usize); 

國內我有一個Box<[T]>my_vec.to_boxed_slice())。我可以很容易地獲得大小/長度,但我不知道應該返回哪個指針。如果我將從boxed_slice.as_mut_ptr()返回的指針傳遞給,則應用程序將崩潰。但是,如果我傳遞從Box::into_raw返回的指針,我無法找到內存佈局的保證(指針指向數組的第一個元素,並且將繼續爲所有未來的Rust版本這樣做)。

這裏有什麼解決方案?

回答

2

Box::into_raw返回一個指向分配存儲開始的指針。切片是內存中連續的項目序列。因此,指針指向切片中的第一個項目。如果Box::into_raw返回其他任何東西,它將不會非常有用。

boxed_slice.as_mut_ptr()Box::into_raw之間的主要區別是,Box::into_raw取得所有權的盒子,但不釋放它,而boxed_slice.as_mut_ptr()僅返回指針的副本,並離開Box你的函數的所有權,所以編譯器隱其丟棄在返回之前。這意味着當你使用boxed_slice.as_mut_ptr()時,你基本上返回一個指向釋放內存的指針!

+0

_這意味着當你使用'boxed_slice.as_mut_ptr()'時,你基本上返回一個指向釋放內存_...的指針,實際上我使用的是'mem :: forget',但這並不重要。 – vinipsmaker

+0

你可以將我鏈接到這種內存佈局的參考嗎? 'Box :: into_raw'會返回一個指向第一個元素的指針?如果這是真的,我的問題就回答了,我不需要再問任何其他問題。 – vinipsmaker

+1

「切片是一個視圖,表示爲指針和長度的內存塊。」 [DOC](https://doc.rust-lang.org/std/slice/)。片數據的存儲器佈局未指定。您需要調用slice上的'as_mut_ptr'來獲取有效的數據指針。 –

相關問題