P.SAF.FFI.03 应优先选用 RAII 方式管理外部资源
【描述】
FFI 编程中关于资源管理,遵循着 “谁申请谁释放” 的原则。因此在 Rust 中调用 FFI 函数创建的资源,也 应该调用相应的 FFI 函数来释放资源。常见的资源类型包括:堆内存、文件、硬件接口等。
使用 RAII 方式管理外部资源,可以有效避免忘记释放或重复释放问题。
【说明】
RAII 是指 resource acquisition is initialization,通过对象的构造函数获取资源,并在对象的析构函数 释放资源。
【正例】
Rust
extern "C" {
fn new_resource() -> *mut Resource;
fn process_resource(resource: *mut Resource);
fn free_resource(resource: *mut Resource);
}
#[repr(C)]
struct CResource(*mut Resource);
impl CResource {
fn new() -> Self {
unsafe { Self(new_resource()) }
}
fn process(&self) {
unsafe { process_resource(self.0) }
}
}
impl Drop for CResource {
fn drop(&mut self) {
unsafe { free_resource(self.0) }
}
}
fn main() {
let mut res = CResource::new();
res.process();
}