java 释放指针_C库释放来自Rust的指针
我想對需要回調的C庫執行Rust綁定,并且此回調必須返回一個C風格的 char* 指向C庫的指針,然后釋放它 . 回調必須在某種意義上暴露給我的庫的用戶(可能使用閉包),并且我想盡可能方便地提供Rust接口(意味著如果可能的話接受 String 輸出) .
但是,C庫在嘗試使用Rust分配的內存時會抱怨,可能是因為Rust使用了jemalloc而C庫使用了malloc .
所以目前我可以看到兩個使用 libc::malloc() 的變通方法,但它們都有缺點:
為庫的用戶提供他必須填寫的切片(不方便,并施加長度限制)
拿出他的 String 輸出,將其復制到malloc分配的數組中,然后釋放 String (無用的復制和分配)
有人能看到更好的解決方案嗎?
這是C庫的接口的等價物,以及理想情況的實現(如果C庫可以釋放Rust中分配的String)
extern crate libc;
use std::ffi::CString;
use libc::*;
use std::mem;
extern "C" {
// The second parameter of this function gets passed as an argument of my callback
fn need_callback(callback: extern fn(arbitrary_data: *mut c_void) -> *mut c_char,
arbitrary_data: *mut c_void);
}
// This function must return a C-style char[] that will be freed by the C library
extern fn my_callback(arbitrary_data: *mut c_void) -> *mut c_char {
unsafe {
let mut user_callback: *mut &'static mut FnMut() -> String = mem::transmute(arbitrary_data); //'
let user_string = (*user_callback)();
let c_string = CString::new(user_string).unwrap();
let ret: *mut c_char = mem::transmute(c_string.as_ptr());
mem::forget(c_string); // To prevent deallocation by Rust
ret
}
}
pub fn call_callback(mut user_callback: &mut FnMut() -> String) {
unsafe {
need_callback(my_callback, mem::transmute(&mut user_callback));
}
}
C部分相當于:
#include
typedef char* (*callback)(void *arbitrary_data);
void need_callback(callback cb, void *arbitrary_data) {
char *user_return = cb(arbitrary_data);
free(user_return); // Complains as the pointer has been allocated with jemalloc
}
總結
以上是生活随笔為你收集整理的java 释放指针_C库释放来自Rust的指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java让线程空转_Java锁:悲观/乐
- 下一篇: jupyter ipython disp