审查生成的固定任务

来自 Pin 与 Unpin
Rust 1.98 高级 8分钟 找出 4处问题

审查这个生成的地址敏感任务类型。

构造后让 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");
    }
}

生成代码仅作示例,不代表任何特定模型

在试验场中打开
报告错误