日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java 释放指针_C库释放来自Rust的指针

發布時間:2024/9/3 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的指针的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。