Vector Rust中是否未定义将未初始化的值临时交换为向量?

Vector Rust中是否未定义将未初始化的值临时交换为向量?,vector,rust,swap,undefined-behavior,Vector,Rust,Swap,Undefined Behavior,假设我有一个向量,v:Vec,长度为5,容量为10。以下是否调用未定义的行为 let p = v.as_mut_ptr(); unsafe { std::mem::swap(p, p.offset(5)); std::mem::swap(p.offset(5), p); } 是的,这是未定义的。根据本规范第6.1.3.2.3节: 以下是所有Rust代码中禁止的行为列表,包括在不安全块和不安全函数中。类型检查可以保证这些问题不会由安全代码引起 未初始化内存的读取 p.o

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

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

是的,这是未定义的。根据本规范第6.1.3.2.3节:

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

  • 未初始化内存的读取
p.offset(5)
是未定义的内存,您必须读取它才能交换它


当然,我看不出你的问题的真正意义,因为即使它被定义,操作也将是不可操作的。我怀疑这是的一个工件,并且你有一个实际的问题要解决。

一个定义非常好的行为:语法错误!我想你在不安全的街区漏掉了几个分号…:实际的问题是我想要取两个排序的向量v和w,并且不创建新的向量(尽管我可能会为v保留更多的空间)将w合并到v中。如果类型不一定需要实现默认值,那就太好了。不要与无法安全读取的位置交换。如果该位置未初始化,您可以
ptr::write
,但不能与之交换。