简单得来说就是rust调用cpp写的C接口的dll,其中一个create函数返回一个void*,在需要释放的时候再调用destroy释放并置空,但是destroy后rust判断不出这个指针已经是空指针了
extern crate libc;
extern "C" {
fn create_null() -> *mut libc::c_void;
fn create() -> *mut libc::c_void;
fn destroy(input: *mut libc::c_void);
}
fn main() {
unsafe {
let input = create();
let null_ptr = create_null();
assert!(null_ptr.is_null(), "nullptr is null");
destroy(input);
assert!(input.is_null(), "pointer should be null");// 此时input仍不为null
};
}
#include <stdio.h>
#include <malloc.h>
extern "C" void *create_null()
{
return nullptr;
}
extern "C" void *create()
{
// 具体实现中可能是new 出来的
void *ptr = malloc(100);
return ptr;
}
extern "C" void destroy(int *input)
{
delete input;
input = nullptr;
}
1
共 2 条评论, 1 页
评论区
写评论确实rust调用直接参数传引用就解决了,甚至不需要修改cpp源码😂
--
👇
linsinn: 这是C的问题吧,指针做参数是值传递,
input = nullptr
改的是局部变量input的值,应该把destroy的参数改成二级指针或指针的引用。 https://cplayground.com/?p=opossum-yak-falcon这是C的问题吧,指针做参数是值传递,
input = nullptr
改的是局部变量input的值,应该把destroy的参数改成二级指针或指针的引用。 https://cplayground.com/?p=opossum-yak-falcon