如何在rust结构中安全地包装C指针

如何在rust结构中安全地包装C指针,rust,rust-bindgen,Rust,Rust Bindgen,我正在为Rust中的C库构建安全绑定,我开始面临一个奇怪的问题 我创建了一个结构来拥有指向库返回的对象的不安全指针,并安全地释放它们 这就是我所拥有的: pub struct VipsImage{ 发布(板条箱)ctx:*mut绑定::VipImage, } VipsImage的impl Drop{ fn下降(&mut自我){ 不安全{ if!self.ctx.is_null(){ 绑定::g_object_unref(self.ctx作为*mut c_void); } } } } 只要我不在

我正在为Rust中的C库构建安全绑定,我开始面临一个奇怪的问题

我创建了一个结构来拥有指向库返回的对象的不安全指针,并安全地释放它们

这就是我所拥有的:

pub struct VipsImage{
发布(板条箱)ctx:*mut绑定::VipImage,
}
VipsImage的impl Drop{
fn下降(&mut自我){
不安全{
if!self.ctx.is_null(){
绑定::g_object_unref(self.ctx作为*mut c_void);
}
}
}
}
只要我不在
async
调用之间共享,这就可以正常工作。如果我在
async
函数中返回其中一个对象,然后再使用它,它将被损坏。如果我在一次操作中使用并释放它们,它们将按预期工作。 如何为这样的结构实现
Send
Sync
,以便在线程之间安全地共享它


如果有人想检查完整的库代码,这里有一个问题

您真正的问题是您为这种类型派生了
Clone
。指针被简单地复制,但是您有两个相同映像的实例,每个实例都将被删除。要么不做那种类型的克隆,要么自己正确地实现克隆。@mcarton我同意。。。但当我这么做的时候,我肯定我没有克隆这个对象。我明白这是一个失败,我必须将其删除,但我相信这不是我的问题的原因。它肯定不是“一条线中的所有内容”。它可能在一个线程中。异步编程确实需要线程安全。仅供参考,我已经在GTK框架内编写了一些异步代码,并暗示了原始指针:@mcarton您实际上可以强制执行单线程运行时,然后依靠它不需要为特定任务集发送数据:。以下是使用Hyper的示例: