私は C ライブラリをラップしており、標準的な種類のコンテキスト オブジェクトがあります。
library_context* context = library_create_context();
そして、それを使用して、さらにオブジェクトを作成できます。
library_object* object = library_create_object(context);
そして、それらの両方を破壊します:
library_destroy_object(object);
library_destroy_context(context);
そこで、これを Rust 構造体にまとめました。
struct Context {
raw_context: *mut library_context,
}
impl Context {
fn new() -> Context {
Context {
raw_context: unsafe { library_create_context() },
}
}
fn create_object(&mut self) -> Object {
Object {
raw_object: unsafe { library_create_object(self.raw_context) },
}
}
}
impl Drop for Context {
fn drop(&mut self) {
unsafe {
library_context_destroy(self.raw_context);
}
}
}
struct Object {
raw_object: *mut library_object,
}
impl Drop for Object {
fn drop(&mut self) {
unsafe {
library_object_destroy(self.raw_object);
}
}
}
だから今、私はこれを行うことができ、うまくいくようです:
fn main() {
let mut ctx = Context::new();
let ob = ctx.create_object();
}
ただし、これを行うこともできます。
fn main() {
let mut ctx = Context::new();
let ob = ctx.create_object();
drop(ctx);
do_something_with(ob);
}
つまり、ライブラリ コンテキストは、それが作成するオブジェクトが破棄される前に破棄されます。
Rust のライフタイム システムを使用して、上記のコードがコンパイルされないようにすることはできますか?