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

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

【问题讨论】:

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

标签: javascript c++ emscripten


【解决方案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 不包含它。但是,这并不能真正回答提问者的问题。
    猜你喜欢
    • 1970-01-01
    • 2018-02-04
    • 2011-03-12
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多