rust - 没有挂断电话的ManuallyDrop不会导致内存泄漏吗?
问题描述
我正在浏览wasm-bindgen
指南,我遇到了它为和之间交互而生成的胶水代码。对值的引用从 js 传递到 rust。Rust 必须将它包装起来,这样它就不会调用已实现的 on 。js
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,
}
字段ptr
,cap
和len
即使被. _ ManuallyDrop
但是,任何管理的动态资源(在这种情况下是引用的数据ptr
)都不会被释放,因为drop
没有被调用。
由于JsValue
简单地持有 a u32
,Rust 端不会发生泄漏。而且由于胶水代码确保正确清理&JsValue
参数,因此在 Javascript 端没有内存泄漏。
推荐阅读
- php - 如何修复PHP中文件不上传的问题(上传,但不移动,导致删除)
- go - Fabric SDK 无法初始化加密套件配置
- c++ - 声明原型时如何在主代码块中调用函数
- mongodb - 如何在Mongodb中计算字符串字符
- javascript - 显示值第一次查询后表单上的输入字段(javascript)
- python-3.x - 已找到部分解决方案的正则表达式问题
- ruby-on-rails - 如何修复“未捕获的 TypeError:调度不是函数”?
- hyperledger-fabric - 如何在 Hyperledger Fabric 中查询双重嵌套对象?
- firebase-realtime-database - 在实时数据库中减去两个具有不同路径的值并将结果保存在不同的路径中
- python - numpy append,typeError:无效的类型提升