gpt4 book ai didi

rust - 不进行直接挂断调用的ManuallyDrop是否会导致内存泄漏?

转载 作者:行者123 更新时间:2023-12-03 11:27:08 27 4
gpt4 key购买 nike

我正在阅读wasm-bindgen指南,我遇到了glue code,它是为jsrust之间的交互而生成的。对值的引用从js传递到rust。 Rust必须将其包装在ManuallyDrop中,以便它不会调用在Drop上实现的JsValue

pub fn foo(a: &JsValue) {
// ...
}

#[export_name = "foo"]
pub extern "C" fn __wasm_bindgen_generated_foo(arg0: u32) {
let arg0 = unsafe {
ManuallyDrop::new(JsValue::__from_idx(arg0))
};
let arg0 = &*arg0;
foo(arg0);
}
但是我看不到在 ManuallyDrop::drop上调用了 arg0。因此,除非调用 JsValue函数,否则是否会删除包裹在 ManuallyDrop中的 ManuallyDrop::drop(arg0)?会导致内存泄漏吗?

最佳答案

ManuallyDrop不会阻止内部值被破坏。它只会阻止drop的调用。考虑一个Vec:

pub struct Vec<T> {
ptr: *mut T,
cap: usize,
len: usize,
}
字段 ptrcaplen仍然被销毁,即使被 ManuallyDrop包装。但是,由于未调用 ptr,因此不会释放任何托管的动态资源(在这种情况下为 drop引用的数据)。
由于 JsValue仅持有 u32,因此在Rust端不会发生泄漏。而且由于粘合代码可确保正确清理 &JsValue参数,因此Javascript端不会泄漏任何内存。

关于rust - 不进行直接挂断调用的ManuallyDrop是否会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65778858/

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