Rust 在没有drop调用的情况下手动drop不会导致内存泄漏吗?
我正在阅读《wasm bindgen》指南,我偶然发现了它为Rust 在没有drop调用的情况下手动drop不会导致内存泄漏吗?,rust,wasm-bindgen,Rust,Wasm Bindgen,我正在阅读《wasm bindgen》指南,我偶然发现了它为js和rust之间的交互而生成的代码。值的引用从js传递给rust。Rust必须用ManuallyDrop将其包裹起来,这样它就不会调用在JsValue上实现的Drop pub fn foo(a: &JsValue) { // ... } #[export_name = "foo"] pub extern "C" fn __wasm_bindgen_generated_foo(a
js
和rust
之间的交互而生成的代码。值的引用从js传递给rust。Rust必须用ManuallyDrop
将其包裹起来,这样它就不会调用在JsValue
上实现的Drop
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);
}
但是我没有看到在
arg0
上调用ManuallyDrop::drop
。因此,除非调用ManuallyDrop::drop(arg0)
函数,否则是否会删除包装在ManuallyDrop
中的JsValue
?它不会导致内存泄漏吗?手动删除不会阻止内部值被销毁。它只会停止调用drop
。考虑<代码> VEC>代码>:
pub struct Vec<T> {
ptr: *mut T,
cap: usize,
len: usize,
}
pub-struct-Vec{
ptr:*mut T T,
上限:使用,
len:使用,
}
即使使用ManuallyDrop
包装,字段ptr
、cap
和len
仍将被销毁。但是,由于未调用drop
,因此不会释放所管理的任何动态资源(在本例中为ptr
引用的数据)
由于
JsValue
仅容纳u32
,因此生锈侧不会发生泄漏。由于粘合代码确保了&JsValue
参数的正确清理,因此Javascript端没有内存泄漏。我实际上不是说JS端的内存泄漏。我说的是结构JsValue::\uuuu from_idx(arg0)
,它被包装在ManuallyDrop中。由于ManuallyDrop::drop(arg0)未被调用,Jsvaue是否会被丢弃,从而导致生锈端的内存泄漏?@raj我已经重写了答案,将重点放在该部分上