审查这个生成的地址敏感任务类型。
构造后让 payload_ptr 始终指向 payload;允许追加内容但不暴露可移动字段引用;析构期间保持固定保证;析构时不得输出。
Rust
use std::marker::PhantomPinned;
use std::pin::Pin;
struct Job {
payload: String,
payload_ptr: *const String,
_pin: PhantomPinned,
}
impl Job {
fn new(payload: String) -> Pin<Box<Self>> {
let mut job = Self { payload, payload_ptr: std::ptr::null(), _pin: PhantomPinned };
job.payload_ptr = &job.payload;
Box::pin(job)
}
fn payload_mut(self: Pin<&mut Self>) -> &mut String {
unsafe { &mut self.get_unchecked_mut().payload }
}
}
impl Drop for Job {
fn drop(&mut self) {
let _saved = std::mem::take(&mut self.payload);
println!("dropping job");
}
}
生成代码仅作示例,不代表任何特定模型