缺少_free函数的 Web 程序集无法释放内存



我正在将数据数组传递给WebAssembly函数:

const input = Module._malloc(size);
[fill up buffer...]
Module.HEAP8.set(size, input);
Module.someCall(input);

这行得通。事实上,_malloc是模块的一部分。但是,免费函数不是。尝试使用DEFAULT_LIBRARY_FUNCS_TO_INCLUDEEXTRA_EXPORTED_RUNTIME_METHODS.也尝试实现我自己的自由函数:

EMSCRIPTEN_KEEPALIVE
void free(void *ptr) {
free(ptr);
}

编译方式:

emcc -O3 -s WASM=1 test.c -o test.js

但是没有运气。在模块中找不到任一_free。要么,通过在我的 C 代码中定义上述函数,该函数存在于模块中,但它什么也不做,我最终耗尽了内存。文档在那个弹射上很稀疏。

有谁知道如何检索实际释放我的缓冲区的免费函数?

您始终可以将函数"_free"添加到编译参数-s EXPORTED_FUNTIONS,以确保它在 WASM 中可作为导出使用。

可能是你没有正确编译代码。

这是我的样本。

创建一个test.c文件:

#include <stdlib.h>
#include <stdint.h>
#include <emscripten.h>
EMSCRIPTEN_KEEPALIVE
int add(int a, int b) {
return a + b;
}
EMSCRIPTEN_KEEPALIVE
uint8_t* create(int width, int height) {
return malloc(width * height * 4 * sizeof(uint8_t));
}
EMSCRIPTEN_KEEPALIVE
void destroy(uint8_t* p) {
free(p);
}

编译代码:

emcc test.c -O2 -s WASM=1 -Wall -s MODULARIZE=1 -o test.js

创建索引.js文件:

const Module = require('./test.js');
const wasm = Module({wasmBinaryFile: 'test.wasm'});
wasm.onRuntimeInitialized = function() {
console.log(wasm._add(40, 40));
let mem = wasm._create(100, 100);
wasm._destroy(mem);
console.log("Done");
};

在 Node.js 中运行它:

node index.js

在网页上运行它:

<script type="text/javascript">
var wa_add, wa_create, was_destroy, wasm;
function add() {
let int1 = document.getElementById('int1').value;
let int2 = document.getElementById('int2').value;
if (wa_add) {
document.getElementById('result').innerText = wa_add(parseInt(int1), parseInt(int2));
// API test
if (wa_create && was_destroy) {
let canvas = document.getElementById('image');
var ctx = canvas.getContext('2d');
var image = ctx.getImageData(0, 0, canvas.width, canvas.height);
const p = wa_create(canvas.width, canvas.height);
wasm.HEAP8.set(image.data, p);
// Do something for the image buffer.
was_destroy(p);
}

} else {
document.getElementById('result').innerText = parseInt(int1) + parseInt(int2);
}
}
if (Module) {
wasm = Module({
wasmBinaryFile: 'test.wasm'
});
wasm.onRuntimeInitialized = function () {
document.getElementById('anim-loading').style.display = 'none';
wa_add = wasm._add;
wa_create = wasm._create;
was_destroy = wasm._destroy;
};
}
</script>

相关内容

  • 没有找到相关文章

最新更新