如何从原始指针获取数组或切片?

vir*_*tor 5 unsafe rust

我可以以某种方式获得一个数组std::ptr::read吗?

我想做一些接近的事情:

let mut v: Vec<u8> = ...
let view = &some_struct as *const _ as *const u8;
v.write(&std::ptr::read<[u8, ..30]>(view));
Run Code Online (Sandbox Code Playgroud)

哪个在此表单中无效(不能使用数组签名).

Vla*_*eev 12

如果要从原始指针获取切片,请使用std::slice::from_raw_parts():

let slice = unsafe { std::slice::from_raw_parts(some_pointer, count_of_items) };
Run Code Online (Sandbox Code Playgroud)

你确定要std::slice::from_raw_parts_mut()吗?如果没有特别小心,它将对带有析构函数的结构造成灾难.此外,read()不从指向字节的指针读取某些指定类型的值; 它读取指针背后的类型的一个值(例如,如果它是read()然后*const u8将读取的一个字节)并返回它.

如果您只想将结构的字节内容写入向量,则可以从原始指针获取切片:

let slice = unsafe { std::slice::from_raw_parts_mut(some_pointer, count_of_items) };
Run Code Online (Sandbox Code Playgroud)

这使得您的代码依赖于平台,甚至依赖于编译器:如果在结构中使用可变大小的类型(例如read()/ isize),或者如果不使用usize,则写入向量的数据很可能被读作垃圾另一台机器(#[repr(C)]有时甚至可能不解除这个问题,据我记得).

  • 知道创建切片后,删除切片时是否会释放内存吗?该文档不清楚,并且在调用应该释放先前分配的内存(在 C 端)的 C 函数时,我收到“双重释放”错误。 (2认同)