[英]Rust function that allocates memory and calls a C++ callback crashes
銹代碼:
#[repr(C)]
pub struct Tmp {
pub callback: extern "C" fn(i: i32),
}
#[no_mangle]
pub extern "C" fn set_callback(callback: extern "C" fn(i: i32)) -> *mut Tmp {
let mut tmp = Box::new(Tmp { callback });
println!("tmp as ptr: {:p}", tmp); // >> here <<
&mut *tmp
}
#[no_mangle]
pub extern "C" fn use_callback(tmp_ptr: *mut Tmp) {
unsafe {
((*tmp_ptr).callback)(1);
((*tmp_ptr).callback)(3);
}
}
C ++代碼:
struct Tmp {
void (*callback)(int32_t);
};
typedef Tmp*(__stdcall* set_callback_t)(void(*callback_t)(int32_t));
typedef void(__stdcall* use_callback_t)(Tmp*);
void callback(int32_t i) {
printf("%d\n", i * 2);
}
int main() {
// ... loading rust part as .dll
// ... checking if loaded correctly
Tmp* tmp_ptr = set_callback(callback);
printf("tmp_ptr %p\n", tmp_ptr);
use_callback(tmp_ptr);
// ... freeing the .dll
}
當我編譯該程序時,它可以按預期工作。 Rust和C ++中指向Tmp
結構的指針的打印值匹配。 當我注釋掉Rust中的println
時,C ++程序崩潰了,這意味着此(可能是Rust部分)代碼出了點問題。
我正在使用Rust代碼作為.dll。 我想將C ++函數的指針傳遞給set_callback
函數,然后在C ++代碼中調用use_callback
時在use_callback
函數中使用該指針。
據我了解,最后,我將不得不調用Rust函數來刪除Tmp
結構,但我將其遺漏了。
Rust中的Box
與C ++中的std::unique_ptr
相似。 構造tmp
的方式將在函數末尾釋放所指向的數據。
為了將指針“泄漏”到C ++世界中,您應該使用Box::into_raw
。
注意,由於不能保證Rust和C ++分配內存的方式相同; 您將必須將指針傳遞回Rust並使用Box::from_raw
取消分配它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.