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 的结果不佳