【发布时间】:2015-08-29 05:26:34
【问题描述】:
我正在为 libsvm 编写 FFI 包装器。它使用的结构之一有一个**struct{int, double} 作为成员。确切的规范并不重要,但它基本上只是一个稀疏双精度向量列表。
在我的包装器中,显然我允许数据从 Rust 端进来,所以我有:
#[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);
作为参考,这些东西的 C 版本如下所示:
struct svm_node {
int index;
double value;
};
struct svm_prob {
struct svm_node **data;
// other fields that aren't important to the question
};
void do_something(svm_prob *prob);
data 成员在 Rust 方面是只读的,它仅用于在构造问题后查找内容。
SvmProb 的crep 的data 字段实际上只是raw_data.as_ptr()。它的构造方式是从data 的每个元素中获取as_mut_ptr:
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 }
}
}
问题是,raw_data 在构造 SvmProb 之后永远不会被访问或设置,raw_data 指针被添加到 crep 之前,SvmProb 被构造并由新函数产生。所以 rustc/Cargo 抱怨 SvmProb 的成员 raw_data 是“死代码”。
我的问题是:这真的是死代码,还是我需要维护raw_data 以使内存像我想的那样保持活力?或者,有没有办法强制Vec 产生其原始指针并告诉它在dropped 时不再需要管理它?或者,是否有没有#[allow(dead_code)] 的方式向 Rust 提示 Vec 存在的唯一原因是为了内存保持活动的目的?
我意识到我可以通过使用heap::allocate 和各种其他不安全的访问器来填充CSvmNode.data,但我觉得使用 Vec 来管理它然后获取它的指针更安全且更少容易出错。
【问题讨论】:
标签: rust