日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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