[英]When is the memory claimed by a Javascript object freed after last reference is deleted?
[英]How to ensure wasm memory is freed when using it from JavaScript
我有一个 C 库,如下所示:
struct timeseries *ts_create(void) {
/* Allocate some memory and return a pointer. */
}
void ts_free(struct timeseries *p) {
/* Free the memory block pointed to by p. */
}
/* And many other functions that receive a struct timeseries * and
* do things to it.
*/
我用emscripten
编译了它,我正在为它创建一个 JavaScript 接口(包装器),如下所示:
const timeseries = {
ptimeseries: 0,
initialize() {
this.ptimeseries = cfunctions.ts_create();
},
destroy() {
cfunctions.ts_free(this.ptimeseries);
},
// And many other functions
}
你可以这样使用它:
const myTimeseries = Object.create(timeseries);
try {
myTimeseries.initialize();
// do more things
} finally {
myTimeseries.destroy();
}
问题是我想在 C(或 JavaScript 包装器)中保留“危险”的东西,即 memory 分配和释放,以便 JavaScript 程序员可以安全地使用生成的库。 JavaScript 程序员习惯于对象自动释放自己,并要求他们添加某种try... finally
语句很容易出错。
但据我所知,JavaScript 没有任何 object 析构函数或任何类型的onGarbageCollect(object)
事件。
我该怎么办?
有一个名为 FinalizationRegistry 的新功能 JavaScript,您可以将其用于此功能,但请注意,并非所有浏览器都支持它 ( https://caniuse.com/mdn-javascript_builtins_finalizationregistry )
const registry = new FinalizationRegistry((heldValue) => {
cfunctions.ts_free(heldValue);
});
class Timeseries {
constructor() {
this.ptimeseries = cfunctions.ts_create();
registry.register(this, this.ptimeseries, this);
}
destroy() { // manual destructor for backup, you don't have to call this
registry.unregister(this);
cfunctions.ts_free(this.ptimeseries);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.