Skip to content

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();
}