【问题标题】:Is it undefined in Rust to temporarily swap uninitialized values into a vector?在 Rust 中是否未定义临时将未初始化的值交换为向量?
【发布时间】:2015-08-03 03:21:23
【问题描述】:

假设我有一个向量,v: Vec<T>,长度为 5,容量为 10。以下是否会调用未定义的行为?

let p = v.as_mut_ptr(); 
unsafe {
    std::mem::swap(p, p.offset(5));
    std::mem::swap(p.offset(5), p);
}

【问题讨论】:

  • 一个非常明确的行为:语法错误!我想你错过了 unsafe 块上的几个分号......:D

标签: vector rust swap undefined-behavior


【解决方案1】:

是的,这是未定义的。来自Rust Reference 的第 6.1.3.2.3 节:

以下是所有 Rust 代码中禁止的行为列表,包括在不安全块和不安全函数中。类型检查保证这些问题绝不是由安全代码引起的。

  • ...
  • 读取 undef(未初始化)内存
  • ...

p.offset(5) 是未定义的内存,您必须读取它才能进行交换。

当然,我真的不明白你的问题的意义,因为即使它被定义了,该操作也是无操作的。我怀疑这是XY Problem 的人工制品,并且您有一个要解决的实际问题。

【讨论】:

  • 实际的问题是我想取两个已排序的向量 v 和 w 并且不创建新向量(尽管我可能会为 v 保留更多空间)将 w 合并到 v 中。如果类型不一定需要实现 Default。
  • 不要与无法安全读取的位置交换。如果位置未初始化,您可以ptr::write 到它,但不能与之交换。
猜你喜欢
  • 1970-01-01
  • 2015-07-19
  • 2016-01-28
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多