【问题标题】:How do I allocate an array at runtime in Rust?如何在 Rust 运行时分配数组?
【发布时间】:2016-03-27 17:45:21
【问题描述】:

分配数组后,如何手动释放它?在不安全模式下可以进行指针运算吗?

就像在 C++ 中一样:

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

Rust 中有没有等价的代码?

【问题讨论】:

  • 此处的数组部分 (rustbyexample.com/primitives/array.html) 可能会对您有所帮助。
  • 我要指出这是糟糕的 C++ 代码(delete 的存在是一种放弃)。惯用的 C++ 将是 std::vector&lt;double&gt; A; for (int i = 0; i &lt; 1000; ++i) { A.push_back(i); }:没有显式的内存操作!

标签: memory dynamic rust allocation


【解决方案1】:

根据您的问题,如果您还没有这样做,我建议您阅读Rust Book。惯用的 Rust 几乎从不涉及手动释放内存。

至于动态数组的等价物,你想要a 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();

【讨论】:

  • 该问题要求一个数组并提供 C++ 等效项作为示例,而此答案则涵盖了动态集合类型。这也涵盖了在 rust 中分配数组的前两个谷歌结果,但我认为这不能回答问题。
  • @Score_Under:除了 C++ 代码使用的是动态分配的数组,因此几乎没有实际区别。直接翻译是不安全和不习惯的。另外,考虑到最初的提问者接受了给定的答案,我会说它确实回答了他们打算提出的问题。
  • 问题中的数组是在运行时分配的,否则它是一个固定数组(无法调整大小、追加等)。 Rust 确实有一个等价的类型,并且它是一些标准库函数所必需的(例如,从文件中批量读取时)。
  • @Score_Under:Rust 通常没有办法在堆上可靠地分配固定大小的数组,except 通过 Vec,此时陷入谈论仅具有利基用途的类型并没有多大好处。此外,问题中没有迹象表明使用固定大小甚至很重要。至于需要固定大小数组的标准库,您将不得不指定,因为我不知道。
  • @Score_Under 是您所指的函数中的切片而不是数组fn read(&amp;mut self, buf: &amp;mut [u8]) -&gt; Result&lt;usize&gt;
【解决方案2】:

完全可以在堆上分配一个固定大小的数组:

let a = Box::new([0.0f64; 1000]);

由于 deref 强制,您仍然可以将其用作数组:

for i in 0..1000 {
    a[i] = i as f64;
}

您可以通过以下方式手动释放它:

std::mem::drop(a);

drop 拥有数组的所有权,所以这是完全安全的。正如另一个答案中提到的,几乎没有必要这样做,当它超出范围时,盒子会自动释放。

猜你喜欢
  • 2012-09-01
  • 2015-07-26
  • 2017-04-20
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 2019-12-24
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多