簡體   English   中英

分配內存並調用C ++回調的Rust函數崩潰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM