一旦我分配了阵列,我该如何手动释放它?指针算法在不安全模式下是否可行?
与C ++一样:
double *A=new double[1000];
double *p=A;
int i;
for(i=0; i<1000; i++)
{
*p=(double)i;
p++;
}
delete[] A;
Rust中是否有相同的代码?
答案 0 :(得分:9)
根据您的问题,如果您还没有这样做,我建议您阅读Rust Book。 Idiomatic Rust几乎永远不会涉及手动释放内存。
至于动态数组的等效项,您需要Vector
。除非你做一些不寻常的事情,否则你应该避免在Rust中使用指针算法。您可以将上述代码编写为:
// Pre-allocate space, then fill it.
let mut a = Vec::with_capacity(1000);
for i in 0..1000 {
a.push(i as f64);
}
// Allocate and initialise, then overwrite
let mut a = vec![0.0f64; 1000];
for i in 0..1000 {
a[i] = i as f64;
}
// Construct directly from iterator.
let a: Vec<f64> = (0..1000).map(|n| n as f64).collect();
答案 1 :(得分:1)
完全有可能在堆上分配一个固定大小的数组:
let a = Box::new([0.0f64; 1000]);
由于deref强制,您仍然可以将其用作数组:
for i in 0..1000 {
a[i] = i as f64;
}
您可以通过以下操作手动释放它:
std::mem::drop(a);
drop
拥有阵列的所有权,因此这是完全安全的。如另一个答案中所提到的,几乎不需要这样做,当超出范围时,该框将自动释放。