gpt4 book ai didi

c++ - Webassembly内存管理和指针

转载 作者:行者123 更新时间:2023-12-02 10:15:21 26 4
gpt4 key购买 nike

我正在使用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;”,我仍然能够使用该字符串?

我问这的原因是因为我对 vector 有非常相似的情况,即不是指向chars的指针,而是指向uint8_t的指针,即:
const vector<uint8_t>&  someString;

当我尝试发送指针时,将 vector 的第一个值poit回到Java脚本,即像这样
const uint8_t* wasmVectorArrayRecostructedPtr = &someString[0];
uint8_t* nonConstBufferReconstructed = const_cast<uint8_t*>(wasmVectorArrayRecostructedPtr);
char* charArrayPtrCasted = (char*) nonConstBufferReconstructed;

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

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

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

最佳答案

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

when i try to send the pointer, poiting to the first value of the vector back to java script

then i get some random garbage instead of the string.


JavaScript无法理解 vector类型。

关于c++ - Webassembly内存管理和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62177715/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com