为文件操作编写一个 dll,我遇到了一些问题。
要通过 file.read 从文件中读取字节,我需要一个所需长度的 char* 数组。 由于长度是可变的,我不能使用
char* ret_chars[next_bytes];
它给出了 next_bytes 不是常量的错误。
StackOverflow 中的另一个主题是使用:
char* ret_chars = new char[next_bytes];
据我所知,使用“new”创建它需要稍后使用“delete”。
现在,如果这个函数的返回值应该是这个数组,我应该如何删除这个数组? 哪里都不用delete,岂不是内存泄露?
如果这有帮助的话:这是一个我将从“Game Maker”调用的 DLL。因此,我之后无法删除任何内容。
希望有人能帮助我!
最佳答案
当您编写将由现有代码调用的回调时,您必须遵循其规则。
假设“Game Maker”的作者不是彻头彻尾的白痴,他们会释放您返回的内存。所以你必须检查文档以找出它们将使用什么函数来释放内存,然后你必须调用匹配的分配器。
在这些情况下,框架通常会提供专门为您设计的分配函数,用于分配返回缓冲区。
另一种常见的方法是您从不返回由回调分配的缓冲区。相反,框架将一个缓冲区传递给您的回调,您只需填写它即可。也请检查文档以了解这种可能性。
没有编写“Game Maker”插件/扩展的示例代码吗?
看起来开发者确实是彻头彻尾的白痴,至少在插件接口(interface)的设计上是这样,但他们确实提供了some guidance。 .
Note that you have to be careful with memory management. That is why I declared the resulting string global.
这意味着 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 脚本将负责在再次调用您的函数并覆盖它之前复制该结果字符串。
关于c++ - 函数中的 "New"和 "delete",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17681616/