gpt4 book ai didi

rust - 如何将 *const 指针转换为 Vec 以正确删除它?

转载 作者:行者123 更新时间:2023-11-29 08:10:13 25 4
gpt4 key购买 nike

asking 之后我应该如何跨越 FFI 边界释放内存,Rust reddit 上的某个人建议我可以使用 Vec::from_raw_parts 而不是将我的结构包装在 Box 中从以下结构构造一个向量,并且可以安全地删除它:

#[repr(C)]
pub struct Array {
data: *const c_void,
len: libc::size_t,
}

但是,from_raw_parts 似乎需要*mut _ 数据,所以我不确定如何继续……

最佳答案

非常简短的回答是self.data as *mut u8。但是,让我们谈谈更多细节......

首先,警告的话:

  1. 不要使用Vec::from_raw_parts,除非指针最初来自Vec无法保证任意指针将与 Vec 兼容,如果继续,您可能会在程序中产生巨大的漏洞。

  2. 不要释放不属于您的指针。这样做会导致双重释放,这会在您的程序中造成其他大漏洞。

  3. 在重建向量之前,您需要知道向量的容量。您的示例结构仅包含一个 len。这仅在 lencapacity 相等时才可接受。

现在,让我们看看我是否可以遵循我自己的规则......

extern crate libc;

use std::mem;

#[repr(C)]
pub struct Array {
data: *const libc::c_void,
len: libc::size_t,
}

// Note that both of these methods should probably be implementations
// of the `From` trait to allow them to participate in more places.
impl Array {
fn from_vec(mut v: Vec<u8>) -> Array {
v.shrink_to_fit(); // ensure capacity == size

let a = Array {
data: v.as_ptr() as *const libc::c_void,
len: v.len(),
};

mem::forget(v);

a
}

fn into_vec(self) -> Vec<u8> {
unsafe { Vec::from_raw_parts(self.data as *mut u8, self.len, self.len) }
}
}

fn main() {
let v = vec![1, 2, 3];
let a = Array::from_vec(v);
let v = a.into_vec();
println!("{:?}", v);
}

请注意,我们不必显式删除 Vec,因为 Vec 的正常 Drop 实现会起作用。我们只需要确保正确构造一个 Vec

关于rust - 如何将 *const 指针转换为 Vec 以正确删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34622127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com