Emscripten malloc 和跨 JS 和 C++ 的免费

Posted

技术标签:

【中文标题】Emscripten malloc 和跨 JS 和 C++ 的免费【英文标题】:Emscripten malloc and free across JS and C++ 【发布时间】:2015-12-02 18:27:18 【问题描述】:

假设我通过 Emscripten _malloc (javascript) 在 Javascript 中分配了一些内存 M。我是否可以将 M 的所有权传递给调用 free (C++) 的编组 C++ 函数?

【问题讨论】:

我没有使用 Emscripten 的经验,但我很确定答案是 no 大写 N。你甚至不应该在 C 之间传递指针的所有权独立编译的代码 - 你永远不知道使用了哪个版本的运行时,以及 free() 和 malloc() 是否使用相同的语言。 【参考方案1】:

是的。在 Emscripten 中,C++ 版本的 malloc 被转换为 JavaScript 中的 Module._malloc();同样 Module._free() 和 C++ 的 free() 一样。

【讨论】:

【参考方案2】:

看看这段代码, 这是一段源代码 在 library.js 中关于 emscripten

  free: function() 
#if ASSERTIONS == 2
    Runtime.warnOnce('using stub free (reference it from C to have the real one included)');
#endif
,

正如你所见,free 没有实现 但你可以通过下面的例子免费

    char *s1 = (char*) malloc ( 256 );

    EM_ASM_INT ( 
        return _free ( $0  );
    , s1 ) ;   

目前以这种方式工作 这是一个完整的例子

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <emscripten.h>

int main ( void )

    // ************************************** free do not free
    char *s1 = (char*) malloc ( 256 );
    strcpy ( s1,"Hello\0" ) ;
    puts (s1); 
    free(s1);
    puts(s1); 

    // ************************************** free do not free  
    char *s2  = (char* )EM_ASM_INT ( 
        var p = Module._malloc(256);
        setValue ( p + 0 , 65 , 'i8' ) ; // A
        setValue ( p + 1 , 66 , 'i8' ) ; // B
        setValue ( p + 2 , 67 , 'i8' ) ; // C
        setValue ( p + 3 , 0  , 'i8' ) ;
        return p ; 
     , NULL ); 
    puts(s2); 
    free(s2);   // do not free
    puts(s2); 

    // ************************************** _free do free
/*
    EM_ASM_INT ( 
        return _free ( $0  );
    , s1 ) ;   
    EM_ASM_INT ( 
        return _free ( $0  );
    , s1 ) ;   
*/
    puts(s1); 
    puts(s2);   


    char * s3 = (char*) EM_ASM_INT ( 
    var  str = 'ciao' ;
    var  ret  = allocate(intArrayFromString(str), 'i8', ALLOC_NORMAL);
    return  ret ;
    , NULL  ) ;

    puts( s3 ) ;
    free(s3); // do not free
    puts( s3 ) ;

    // ************************************** _free do free
/*
    EM_ASM_INT ( 
        return _free ( $0  );
    , s3 ) ; 
*/
    puts( s3 ) ;

 return 0 ;

【讨论】:

这是不正确的。如警告消息中所述,如果从 C 调用,free 的实际实现将可用。如果不使用,Emscripten 不包含它。但是,这并不能真正回答提问者的问题。

以上是关于Emscripten malloc 和跨 JS 和 C++ 的免费的主要内容,如果未能解决你的问题,请参考以下文章

Emscripten 将 C++ 编译为 JavaScript 和 Asm.js 的结果不佳

Emscripten 网页js调用C++ (ffmpeg)

Emscripten 网页js调用C++ (ffmpeg)

Emscripten 网页js调用C++ (ffmpeg)

从 Asm.js/emscripten 启用 WebGL 扩展?

使用 emscripten 生成 python.cc.js