c++ - 函数中的 "New"和 "delete"

标签 c++ dll new-operator delete-operator

为文件操作编写一个 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/

相关文章:

java - 基本的数组初始化和排序问题

c++ - 如何找到USB驱动器号?

c++ - 什么会导致应用程序在工作几个小时后因 SIGABRT 获取锁而失败?

c++ - 有没有办法在 Dyalog APL 中⎕NA 导入一个 dll 导出的 C++ 类?

c++ - 如何从子目录自动加载 DLL?

c++ - 使用嵌入式 if 和 else if 语句 C++

c++ - 如何摆脱调试运行时 DLL

c++ - 错误 : ‘result’ does not name a type

c++ - 将 DLL(和关联的 VBA)转换为 XLL

javascript - 对变量使用 new 运算符