首页 > 解决方案 > 没有挂断电话的ManuallyDrop不会导致内存泄漏吗?

问题描述

我正在浏览wasm-bindgen指南,我遇到了它为和之间交互而生成的胶水代码。对值的引用从 js 传递到 rust。Rust 必须将它包装起来,这样它就不会调用已实现的 on 。jsrustManuallyDropDropJsValue

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包裹?它不会导致内存泄漏吗?ManuallyDropManuallyDrop::drop(arg0)

标签: rustwasm-bindgen

解决方案


ManuallyDrop不阻止内在价值被破坏。它只会停止drop被调用。考虑一个Vec

pub struct Vec<T> {
    ptr: *mut T,
    cap: usize,
    len: usize,
}

字段ptr,caplen即使被. _ ManuallyDrop但是,任何管理的动态资源(在这种情况下是引用的数据ptr)都不会被释放,因为drop没有被调用。

由于JsValue简单地持有 a u32,Rust 端不会发生泄漏。而且由于胶水代码确保正确清理&JsValue参数,因此在 Javascript 端没有内存泄漏。


推荐阅读