【发布时间】:2018-03-27 10:27:36
【问题描述】:
我对我的代码有疑问:
pub fn get_signals(path: &String) -> Vec<Vec<f64>> {
let mut rdr = csv::ReaderBuilder::new().delimiter(b';').from_path(&path).unwrap();
let mut signals: Vec<Vec<f64>> = Vec::new();
for record in rdr.records(){
let mut r = record.unwrap();
for (i, value) in r.iter().enumerate(){
match signals.get(i){
Some(_) => {},
None => signals.push(Vec::new())
}
signals[i].push(value.parse::<f64>().unwrap());
}
}
signals
}
Rust 究竟是如何处理返回的?例如,当我写let signals = get_signal(&"data.csv".to_string()); 时,Rust 是否假设我想要一个新的 Vec 实例(复制所有数据)或者只是将一个指针传递给以前分配的内存(通过Vec::new())?最有效的方法是什么?另外,rdr 会发生什么?我假设,鉴于 Rust 的内存安全,它已经被破坏了。
【问题讨论】:
-
您好,欢迎您。如果你还没有,我建议你看看这本书 (here)。
-
我认为命运
rdr是一个完全不同的问题。简而言之:是的,如果没有移动范围结束的任何值,它都会被销毁。这意味着调用他们对Drop::drop的实现,如果有的话。而且这与内存安全无关。内存安全与泄漏(或不泄漏)内存和其他资源无关,它与避免悬空指针和双重释放有关。不破坏任何东西是避免悬空指针和双重释放的一种非常安全的方法;这是Clang编译器使用的策略,是Java Epsilon GC的策略 -
所以,如果我错了,请纠正我。当最后一个指向内存的指针失效时,它会午餐对象 Drop::drop 实现,如果它存在(?)。那么如果内存在堆上,它会一直被占用吗?我可以稍后分配这个内存吗(是否可用)?
-
我真的认为你应该在这里问一个单独的问题;或者检查机制的描述是否已经不可用。对于复杂的主题,评论并不是那么好。