Webassemly内存管理和指针

铁托

我正在使用Webassembly,以便使用标准库进行一些计算。在webassembly中,我们只能传递32位整数和64位整数。这意味着我们也可以将指针传递给数组。这就是我们能够将字符串作为字符数组(即示例)返回的方式

char* EMSCRIPTEN_KEEPALIVE returnStringCharacterArray()
{
  string stringToReturn = "I am learning web assembly";

   char* char_array = new char [stringToReturn.length()+1];
   strcpy (char_array, stringToReturn.c_str());

   char* arrayPtr = &char_array[0];
   // delete [] char_array;
   return arrayPtr;

}

注意该函数中的运算符“ new”。并注意delete [] char_array;那里从未调用过”。这是否意味着如果我忘记在此处调用删除操作,就会在此处发生内存泄漏?我注意到这里很奇怪。如果我确实在数组上调用delete,那么此示例仍然有效!!!这意味着我能够像这样在Java脚本中使用字符串(在已购买的场景中,即具有Delete和不具有):

 var ptr = Module._returnStringCharacterArray();
 var ptr = new Uint8Array(Module.HEAPU8.buffer, ptr, length);
 var theStringObj = new TextDecoder('utf8').decode(ptr);
 console.log(newstring)

如果在下一个函数调用期间调用了“ char_array”,如果没有调用,将如何处理?为什么即使delete [] char_array;调用了”,我仍然能够使用字符串

我之所以这样问,是因为我在向量上有非常相似的情况,即不是指向char的指针,而是指向uint8_t的指针,即:

const vector<uint8_t>&  someString;

当我尝试发送指针时,将向量的第一个值转换回Java脚本,即像这样

const uint8_t* wasmVectorArrayRecostructedPtr = &someString[0];
uint8_t* nonConstBufferReconstructed = const_cast<uint8_t*>(wasmVectorArrayRecostructedPtr);
char* charArrayPtrCasted = (char*) nonConstBufferReconstructed;

然后我得到一些随机垃圾,而不是字符串。起初,我认为这是因为向量是“自动”清除的,因为它在堆栈上是“活动的”,而不是在堆(免费存储)上是“活动的”的“ char_array”。但这似乎并非如此。我在这里想念的是什么。

在javaScript消耗完新操作符之后,我该如何手动释放通过new操作符在此处动态分配的内存。

Module._free(ptr); 

似乎没有用。如何确保“ char_array”对象被JavaScript占用后清除并释放其内存?

吉尔科夫·阿帕

WebAssembly内存可以增长,但永远不会缩小。delete允许覆盖内存,但仍保留供WebAssembly应用程序将来使用。

当我尝试发送指针时,将向量的第一个值转换为Java脚本

然后我得到一些随机垃圾,而不是字符串。

JavaScript无法理解vector类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章