我正在使用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] 删除。
我来说两句