FFI生命周期桥梁:在C与Rust之间安全传递借用和所有权
超越简单的extern "C",掌握如何将Rust的生命周期模型映射到C的原始指针世界,防止内存泄漏和悬垂指针。 · 难度:入门 · +10XP
FFI生命周期桥梁:在C与Rust之间安全传递借用和所有权
当Rust与C交互时,生命周期的概念消失了。本教程将构建一个安全封装C库的Rust binding,利用extern type和自定义Drop来保证C分配的内存被正确释放。重点讲解如何用&'a和*const T之间的转换,以及如何通过PhantomData将C指针的生命周期绑定到Rust对象的生命周期上,从而让编译器保护你。
extern "C" {
fn create_resource() -> *mut u8;
fn free_resource(ptr: *mut u8);
}
struct Resource<'a> {
ptr: *mut u8,
_marker: PhantomData<&'a mut u8>,
}
impl<'a> Resource<'a> {
fn new() -> Self { Resource { ptr: unsafe { create_resource() }, _marker: PhantomData } }
}
impl Drop for Resource<'_> {
fn drop(&mut self) { unsafe { free_resource(self.ptr); } }
}