如何在Rust中运行时分配数组?

时间:2015-12-21 15:37:17

标签: memory dynamic rust allocation

一旦我分配了阵列,我该如何手动释放它?指针算法在不安全模式下是否可行?

与C ++一样:

double *A=new double[1000];
double *p=A;
int i;
for(i=0; i<1000; i++)
{
     *p=(double)i;
      p++;
}
delete[] A;

Rust中是否有相同的代码?

2 个答案:

答案 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拥有阵列的所有权,因此这是完全安全的。如另一个答案中所提到的,几乎不需要这样做,当超出范围时,该框将自动释放。