簡體   English   中英

Emscripten malloc和JS和C ++之間的免費版

[英]Emscripten malloc and free across JS and C++

假設我通過Emscripten _malloc (Javascript)在Javascript中分配一些內存M. 我是否允許將M的所有權傳遞給一個調用free (C ++)的封送C ++函數?

是。 在Emscripten中,malloc的C ++版本在JavaScript中轉換為Module._malloc(); 同樣,Module._free()與C ++的free()相同。

看看這段代碼,這是關於emscripten的library.js中的一段源代碼

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

因為你看到免費沒有實現,但你可以免費下面的例子

    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 ;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM