< 返回版块

enpitsuLin 发表于 2022-07-26 15:07

Tags:ffi

简单得来说就是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;
}

评论区

写评论
作者 enpitsuLin 2022-07-26 17:42

确实rust调用直接参数传引用就解决了,甚至不需要修改cpp源码😂

--
👇
linsinn: 这是C的问题吧,指针做参数是值传递,input = nullptr改的是局部变量input的值,应该把destroy的参数改成二级指针或指针的引用。 https://cplayground.com/?p=opossum-yak-falcon

linsinn 2022-07-26 15:57

这是C的问题吧,指针做参数是值传递,input = nullptr改的是局部变量input的值,应该把destroy的参数改成二级指针或指针的引用。 https://cplayground.com/?p=opossum-yak-falcon

1 共 2 条评论, 1 页