Rust 在没有drop调用的情况下手动drop不会导致内存泄漏吗?

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

我正在阅读《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(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我已经重写了答案,将重点放在该部分上