Rust 是否需要将该元件的锈迹标记为“死代码”?

Rust 是否需要将该元件的锈迹标记为“死代码”?,rust,Rust,我正在给libsvm写一个FFI包装。它使用的一个结构的成员是**struct{int,double}。这一点的确切说明并不重要,但它基本上只是一个双倍稀疏向量的列表 在我的包装中,显然我允许数据从生锈的一面进入,因此我有: #[repr(C)] pub struct SvmNode(pub i32, pub f64); #[repr(C)] struct CSvmProb { data: *mut *mut SvmNode // other fields that aren'

我正在给libsvm写一个FFI包装。它使用的一个结构的成员是**struct{int,double}。这一点的确切说明并不重要,但它基本上只是一个双倍稀疏向量的列表

在我的包装中,显然我允许数据从生锈的一面进入,因此我有:

#[repr(C)]
pub struct SvmNode(pub i32, pub f64);

#[repr(C)]
struct CSvmProb {
    data: *mut *mut SvmNode
    // other fields that aren't important
}

pub struct SvmProb {
    crep: CSvmProb,
    data: Vec<Vec<SvmNode>>,
    // other fields that aren't important

    raw_data: Vec<*mut SvmNode>
}

extern "C" fn do_something(prob: *mut CSvmProb);
数据成员是只读的,只用于构造问题后查找内容

SvmProb的crep的数据字段实际上只是原始数据。它的构造方式是从每个数据元素获取as_mut_ptr:

问题是,在构造SvmProb之后,从未访问或设置原始_数据,在新函数构造并生成SvmProb之前,原始_数据指针被添加到crep。所以rustc/Cargo抱怨SvmProb的成员原始数据是死代码

我的问题是:这真的是死代码,还是我需要维护原始数据以使内存像我想的那样保持活力?或者,是否有一种方法可以强制Vec生成其原始指针,并告诉它在被丢弃时不再需要管理它?或者,有没有一种方法没有[allowdead_code]来提示生锈,Vec存在的唯一原因是为了内存保持活动

我意识到我可以使用heap::allocate和其他各种不安全的访问器来填充CSvmNode.data,但我觉得使用一个Vec来管理它,然后使用它的指针更安全,更不容易出错

我的问题是:这真的是死代码,还是我需要维护原始数据以使内存像我想的那样保持活力

是的,您需要维护原始数据,否则crep将无效

你真的需要SvmProb的crep字段吗?我建议您添加一个crep方法,如下所示:

impl SvmProb {
    #[inline]
    fn crep(&mut self) -> CSvmProb {
        CSvmProb { data: self.raw_data.as_mut_ptr() }
    }
}

如果需要更多数据以这种方式初始化CSvmProb,则需要先将相应字段添加到SvmProb。

我不确定是否需要crep字段,但我记得这样做是出于特定原因。比如,我很确定库中有某种东西要求CSvmProb不会死。
impl SvmProb {
    pub fn new(mut data: Vec<Vec<SvmNode>>) -> SvmProb {
        let raw_data = Vec::with_capacity(data.len());

        for v in data.iter_mut() {
            raw_data.push(v.as_mut_ptr());
        }

        // ...

        let crep = CSvmProb{ data: raw_data.as_ptr() };
        SvmProb { data: data, crep: crep }
    }
}
impl SvmProb {
    #[inline]
    fn crep(&mut self) -> CSvmProb {
        CSvmProb { data: self.raw_data.as_mut_ptr() }
    }
}