我是否需要一个Rc类型来存储一个指向Rust结构的指针在它的成员C结构中

我是否需要一个Rc类型来存储一个指向Rust结构的指针在它的成员C结构中,c,rust,ffi,C,Rust,Ffi,我想将指向rust结构的指针存储在它的成员C结构中。是否需要将结构封装在Rc而不是盒子中? 我问这个问题的原因是,尽管这里有共享所有权,但指针只能从Rust结构的不安全成员函数中访问,并且C结构的生命周期与封闭的Rust结构的生命周期相关联 这里有一个例子-> //带构造函数/析构函数的C结构 结构c_foo{ void*internal;//指向rust`struct的指针` /* ... */ }; 结构c_foo*c_foo_new; void c_foo_freestract c_foo

我想将指向rust结构的指针存储在它的成员C结构中。是否需要将结构封装在Rc而不是盒子中? 我问这个问题的原因是,尽管这里有共享所有权,但指针只能从Rust结构的不安全成员函数中访问,并且C结构的生命周期与封闭的Rust结构的生命周期相关联

这里有一个例子->

//带构造函数/析构函数的C结构 结构c_foo{ void*internal;//指向rust`struct的指针` /* ... */ }; 结构c_foo*c_foo_new; void c_foo_freestract c_foo*foo; 这里有一个C结构C_foo,其中有一个空*存储对Rust结构条的引用。Foo只是bindgen为c_Foo生成的防锈包装。 我需要在Bar::new函数中使用方框还是Rc

澄清一下,生锈一方没有共同所有权。有一个共享的所有权b/w锈和C方,所以我想使用Rc类型没有任何好处

的评论回答了我的问题-

仅当您需要Rust代码中的共享所有权时才使用Rc。由于C不保留此指针类型的语义,因此C代码需要手动处理边界


现在还不清楚你想用Box或Rc实现什么。一般性的指导是必要的,但为什么首先需要它呢?您已经持有指向C结构的指针。它是否必须包含在另一个智能指针中?此外,函数Bar::new没有按原样编译,我需要它是因为C库提供回调,我需要一个指向Rust结构的指针,以便能够调用Rust回调函数。这个问题基本上是我上一个问题的后续->确定,但该代码确实返回一个框,而这个版本的Bar::new只返回一个条。尽管如此,仍然适用于生锈方面:仅当您需要在生锈代码中共享所有权时才使用Rc。由于C不保留这种指针类型的语义,C代码需要手动处理边界,不管如何。但我认为你在下一篇评论中所说的很有道理。这就是我在问题中所说的,“。。。虽然存在共享所有权…'。所以我想我还是手动处理它,只使用一个Box类型。您的注释仅当您需要在Rust代码中共享所有权时才使用Rc。消除了我的困惑。谢谢
// FFI struct generated by bindgen
#[repr(C)]
#[derive(Debug, Copy)]
pub struct Foo {
    pub internal: *mut libc::c_void, // pointer to rust `struct`
    /* ... */
}
// Rust struct that wraps the FFI struct
struct Bar {
    ptr: *mut Foo, // private
    /* ... */
}

impl Bar {
    fn new() -> Box<Bar> {
        unsafe {
            let mut bar = Box::new(Bar { ptr: c_foo_new() });
            let bar_ptr: *mut ffi::c_void = &mut bar as *mut _ as *mut ffi::c_void;
            (*bar.ptr).internal = bar_ptr;
            bar
        }
    }
}


impl Drop for Bar {
    fn drop(&mut self) {
        unsafe {
            c_foo_free((*bar.ptr).internal);
        }
    }
}