您是不是必须释放传递给 Emscripten 中导出的 C 函数的字符串?
Posted
技术标签:
【中文标题】您是不是必须释放传递给 Emscripten 中导出的 C 函数的字符串?【英文标题】:Do you have to free strings passed to exported C functions in Emscripten?您是否必须释放传递给 Emscripten 中导出的 C 函数的字符串? 【发布时间】:2014-06-26 16:05:58 【问题描述】:我通过 Emscripten wiki (Interacting with code) 发现,使用 ccall
或 cwrap
从 javascript 调用的 C 函数在传递或返回字符串时应该将 char*
作为参数或返回类型。
我在 C 方面不是很有经验(我的项目的其余部分是用 C++ 编写的),但我知道您通常必须在 C 中手动释放动态字符串。将字符串从 javascript 传递到 C 函数时是这种情况吗?如果是这样,应该怎么做?
【问题讨论】:
【参考方案1】:在大多数情况下,您可以让 C++ 代码为您处理内存分配和释放。例如,如果你传入一个文字字符串(用引号引起来),它将在函数返回后被释放。
对于可变字符串,我建议你使用 std::string (你可能通常会这样做),当你将它传递给一个 emscripten 函数时,只需调用它的 c_str() 方法来转换它。
例如:
my_js_function(my_string.c_str());
【讨论】:
是的,我知道如何处理 std::string 到 c 字符串的转换等。但我不是在谈论将字符串从 C++ 传递到 javascript。我想反过来做:Call a C function with a string parameter from javascript 我明白了——我还没有尝试使用字符串朝那个方向发展。你不应该在 C 端做任何特别的事情;如果你在 JS 中使用 Module._malloc(),你显然应该在调用之后运行 Module._free()。如果您使用现有字符串的缓冲区,JS 应该处理内存,但更一般地说,我不确定如何将字符串转换为 char*。如果我弄明白了,我会发布一个新的答案(如果你在此期间弄明白了,请告诉我们!) 我已经测试过调用一个从 javascript 中获取const char*
的函数,不需要手动进行转换,您只需执行 ccall("func", null, ["string"], "<data>");
。我会尝试在循环中调用它几次,这应该会显示它是否泄漏内存。
好的,本例似乎没有内存泄漏。我仍然会在今天晚些时候或接下来的几天里尝试其他一些事情——如果没有 const 作为参数类型的 char*
相同的事情在不手动释放它时会泄漏内存,以及是否将非 const 字符串传递给 c 函数会给出c函数修改javascript变量的能力。以上是关于您是不是必须释放传递给 Emscripten 中导出的 C 函数的字符串?的主要内容,如果未能解决你的问题,请参考以下文章
将文件名传递给 Emscripten 生成的 js 作为参数
将 JS 数字数组传递给 emscripten C++ 而无需 reinterpret_cast