gpt4 book ai didi

javascript - 从 JavaScript 使用时如何确保释放 wasm 内存

转载 作者:行者123 更新时间:2023-12-05 03:45:12 24 4
gpt4 key购买 nike

我有一个看起来像这样的 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 接口(interface)(包装器),如下所示:

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 包装器)中保留“危险”的东西,即内存分配和释放,以便 JavaScript 程序员可以安全地使用生成的库。 JavaScript 程序员习惯于对象自动释放自己,要求他们添加某种 try ... finally 语句很容易出错。

但据我所知,JavaScript 没有任何对象析构函数或任何类型的 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);
}
}

关于javascript - 从 JavaScript 使用时如何确保释放 wasm 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65966924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com