首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >free程序集缺少_free函数,无法释放内存

free程序集缺少_free函数,无法释放内存
EN

Stack Overflow用户
提问于 2018-08-23 03:11:29
回答 2查看 2K关注 0票数 5

我将一个数据数组传递给一个WebAssembly函数:

代码语言:javascript
复制
 const input = Module._malloc(size);
 [fill up buffer...]
 Module.HEAP8.set(size, input);
 Module.someCall(input);

这是可行的。事实上,_malloc是该模块的一部分。然而,free函数并非如此。已尝试使用DEFAULT_LIBRARY_FUNCS_TO_INCLUDEEXTRA_EXPORTED_RUNTIME_METHODS。我也尝试实现我自己的免费函数:

代码语言:javascript
复制
EMSCRIPTEN_KEEPALIVE
void free(void *ptr) {
  free(ptr);
}

编译时使用:

代码语言:javascript
复制
emcc -O3 -s WASM=1 test.c -o test.js

但没那么走运。在模块中找不到_free。或者,通过在我的C代码中定义上面的函数,该函数存在于Module中,但它什么也不做,我最终会耗尽内存。医生在这个问题上很稀少。

有没有人知道如何检索释放缓冲区的free函数?

EN

回答 2

Stack Overflow用户

发布于 2021-03-12 00:15:13

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

票数 2
EN

Stack Overflow用户

发布于 2018-08-23 09:26:01

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

这是我的样品。

创建test.c文件:

代码语言:javascript
复制
#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);
}

编译代码:

代码语言:javascript
复制
emcc test.c -O2 -s WASM=1 -Wall -s MODULARIZE=1 -o test.js

创建一个index.js文件:

代码语言:javascript
复制
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中运行它:

代码语言:javascript
复制
node index.js

在网页上运行它:

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51973627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档