当您编写将由现有代码调用的回调时,您必须遵循其规则。
假设“Game Maker”的作者不是完全白痴,他们会释放你返回的内存。所以你必须检查文档以找出他们将使用什么函数来释放内存,然后你必须调用匹配的分配器。
在这些情况下,框架通常会提供一个专门为您设计的分配函数,用于分配返回缓冲区。
另一种常见的方法是您永远不会返回由回调分配的缓冲区。取而代之的是,框架将缓冲区传递给您的回调,您只需将其填入即可。请查看文档以了解这种可能性。
是否没有编写“Game Maker”插件/扩展的示例代码?
看起来开发人员确实是彻头彻尾的白痴,至少在插件接口设计方面是这样,但他们确实提供了一些指导。
请注意,您必须小心内存管理。这就是为什么我将生成的字符串声明为全局的。
这意味着 Game Maker 引擎不会尝试释放返回的缓冲区。
您也可以使用全局变量,或者实际上任何具有静态存储持续时间的变量,例如函数局部静态变量。 std::vector<char>
将是一个不错的选择,因为它很容易调整大小。这样,每次调用函数时,分配给前一次调用的内存都会被重用或释放。因此,您的“泄漏”将仅限于您一次返回的金额。
char* somefunc( void )
{
static std::vector<char> ret_buffer;
ret_buffer.resize(next_bytes);
// fill it in, blah blah
return &ret_buffer[0];
}
// std::string and return ret_string.c_str(); is another reasonable option
您的 Game Maker Language 脚本将负责在再次调用您的函数并覆盖它之前制作该结果字符串的副本。