0

我在 C++ 中创建了一个 MySQL 聚合 UDF。我char*从 MySQL 聚合 UDF 的最终函数返回。在void xxx_deinit(UDF_INIT initid)我正在释放我的函数使用的任何内存。我通过删除init->ptr.

我的 deinit 函数:

extern "C" void xxx_deinit(UDF_INIT * initid)
{
    delete initid->ptr;
}

在 init 函数中,我初始化ptr如下:

extern "C" bool xxx_init(UDF_INIT * initid, UDF_ARGS * args, char* message)
{
    const char*  demo = "demo";

    initid->ptr = (char*) demo;

    return 0;
}

我能够创建 UDF 并将其安装在 MySQL 服务器中。安装后,当我尝试调用该函数时,会弹出一条错误消息,如下所示:

Error Code: 2013. Lost connection to MySQL server during query

delete initid->ptr;但是当我从函数中删除 line:时xxx_deinit(UDF_INIT * initid),我得到了所需的输出。但我猜这是错误的方法,因为它会导致内存泄漏。此外,相同的语句:delete initid->ptr;在返回类型的简单 UDF 的情况下不会产生错误char*。谁能告诉我我在这里做错了什么?任何形式的帮助或建议都会有很大帮助。提前致谢。

谁能帮我解决这个问题。

4

1 回答 1

1

没有内存泄漏,"demo"指向静态内存的指针也是如此。

您正在尝试delete指向未分配的内存的指针new。您的运行时完全有权炸毁。

最简单的解决方案是简单地删除deletedeinit 函数中的 。如果你总是在那里放一个静态字符串,那就足够了。

或者,您可以切换到ptr成员内存的动态分配。在初始化函数中:

initid->ptr = strdup("demo");

在 deinit 函数中:

free(initid->ptr);

请注意,我们使用free而不是delete, 因为strdup分配内存使用malloc. 永远不要交叉new/deletemalloc/free

于 2020-10-01T08:22:02.087 回答