删除 initid->ptr 时与 MySQL 服务器失去连接,MySQL 聚合函数 (UDF)

Lost connection to MySQL server when deleting initid->ptr, MySQL aggregate function (UDF)

我在 C++ 中创建了一个 MySQL 聚合 UDF。 我从 MySQL 聚合 UDF 的最终函数 returning char*。 在 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

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

谁能帮我解决这个问题。

没有内存泄漏,因为 "demo" 是指向静态内存的指针。

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

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

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

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

在deinit函数中:

free(initid->ptr);

请注意,我们使用 free 而不是 delete,因为 strdup 使用 malloc 分配内存。永远不要越过 new/deletemalloc/free!