Rust 如何在结构中使用带有原始指针的PhantomData,使该结构不超过被引用的其他结构的生存期?

Rust 如何在结构中使用带有原始指针的PhantomData,使该结构不超过被引用的其他结构的生存期?,rust,Rust,我有一个结构,它有不安全的代码和指向另一种结构类型的原始可变指针。不安全结构只能在另一个结构的生存期内使用,但不能为指针指定生存期。我发现std::marker::PhantomData可以用于这个未使用的生命周期问题,但我在让它工作时遇到了问题。我不确定这是一个无效的用例还是我做错了什么 : 使用std::marker::PhantomData; pub结构测试{ 值:u32, } impl试验{ 发布fn值(&self){ println!(“{}”,self.value) } pub fn

我有一个结构,它有不安全的代码和指向另一种结构类型的原始可变指针。不安全结构只能在另一个结构的生存期内使用,但不能为指针指定生存期。我发现
std::marker::PhantomData
可以用于这个未使用的生命周期问题,但我在让它工作时遇到了问题。我不确定这是一个无效的用例还是我做错了什么

:

使用std::marker::PhantomData;
pub结构测试{
值:u32,
}
impl试验{
发布fn值(&self){
println!(“{}”,self.value)
}
pub fn set_值(&mut self,值:u32){
自我价值=价值;
}
}
//我想让编译器抱怨测试的生命周期
//因此,在测试结束后,不使用Unsastruct
pub结构unsastruct,
}
恳求{

pub fn new(test:&'a mut test)->UnsafeStructTL;DR您所做的违反了可变引用的排他性要求,但是您可以使用共享引用和内部可变性来创建一个可以工作的API

&mut T
引用表示对
T
的独占访问。当使用
&mut
借用对象时,在
&mut
借用的生命周期内,不得通过任何其他引用(可变或不可变)访问该对象。在本例中:

let mut test = Test { value: 0 };
let mut unsafe_struct: UnsafeStruct;
unsafe_struct = UnsafeStruct::new(&mut test);

unsafe_struct.set_test_value(1);
test.value();

test.set_value(2);
unsafe_struct.test_value();
不安全结构
使
测试
&mut
借用保持活动状态。它内部是否包含原始指针并不重要;它可以不包含任何内容。
不安全结构中的
'a
{
发布fn新(测试:&'a测试)->SafeStruct我在回答我自己的问题。我试图解决的问题是使用
std::marker::PhantomData
来实现使用原始指针向结构添加生命期,以防止在出现自由错误后使用。使用
PhantomData
无法实现这一点。有一个用于处理未处理生命期的用例,但这是不同的这与我试图完成的目标不同,也是我困惑/疑问的根源


我已经意识到并处理过这样一个事实,即在使用不安全代码时必须处理释放后使用和其他错误。我只是想我可能能够在编译时而不是在运行时处理释放后使用这种类型的错误。

为什么不只使用可变引用?如果你是指未安全结构中的可变引用,那么因为我需要不安全的行为。你能解释一下“我需要不安全的行为”是什么意思吗?我需要原始指针功能。我需要直接在借阅检查规则之外操作结构。您可以在结构中存储可变引用,并在需要时将其转换为不安全代码中的原始指针。我创建了自己的答案,解释了到底发生了什么,因为您的答案没有直接回答我关于使用<代码>的问题>std::marker::PhantomData
。关于
PhantomData
的文档和信息很简单,我从一些措辞中得到了错误的印象。我认为借用检查行为是不同的,因为
PhantomData
引用实际上不存在于运行时代码中,只是为了编译器澄清阳离子。关于生命周期、细胞、内部易变性等,您的信息是正确的。这与我试图实现的目标不太相关。我提供了一个简化的示例来说明我遇到的
PhantomData
问题。该示例不代表我的实际代码。我不想/无法将其转换为安全c使用单元格或其他内部易变性的ode。
let mut test = Test { value: 0 };
let mut unsafe_struct: UnsafeStruct;
unsafe_struct = UnsafeStruct::new(&mut test);

unsafe_struct.set_test_value(1);
test.value();

test.set_value(2);
unsafe_struct.test_value();
use std::cell::Cell;

pub struct Test {
    value: Cell<u32>,
}

impl Test {
    pub fn value(&self) {
        println!("{}", self.value.get())
    }

    pub fn set_value(&self, value: u32) {
        self.value.set(value);
    }
}

pub struct SafeStruct<'a> {
    test: &'a Test,
}

impl<'a> SafeStruct<'a> {
    pub fn new(test: &'a Test) -> SafeStruct<'a> {
        SafeStruct { test }
    }

    pub fn test_value(&self) {
        println!("{}", self.test.value.get())
    }

    pub fn set_test_value(&self, value: u32) {
        self.test.set_value(value);
    }
}