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

Posted

技术标签:

【中文标题】删除 initid->ptr、MySQL 聚合函数 (UDF) 时失去与 MySQL 服务器的连接【英文标题】:Lost connection to MySQL server when deleting initid->ptr, MySQL aggregate function (UDF) 【发布时间】:2021-01-16 21:45:49 【问题描述】:

我在 C++ 中创建了一个 mysql 聚合 UDF。 我从 MySQL 聚合 UDF 的最终函数返回 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; 在返回类型为 char* 的简单 UDF 的情况下不会产生错误。 谁能告诉我我在这里做错了什么? 任何形式的帮助或建议都会有很大帮助。 提前致谢。

谁能帮我解决这个问题。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

在deinit函数中:

free(initid->ptr);

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

【讨论】:

那你建议我应该怎么做? 你能给我一些建议吗? 为我的答案添加了两种方式。 试过什么?你附加了调试器吗?它在哪里崩溃? 不,这是明显的内存泄漏。您丢弃了对已分配内存的唯一引用。

以上是关于删除 initid->ptr、MySQL 聚合函数 (UDF) 时失去与 MySQL 服务器的连接的主要内容,如果未能解决你的问题,请参考以下文章

[C++11]独占的智能指针unique_ptr的删除器

错误:使用已删除的函数‘std::unique_ptr<...> [关闭]

具有右值删除器的 unique_ptr 构造函数返回 null?

如何从 boost::ptr_vector 中删除“this”

如何将非静态成员函数作为unique_ptr删除器传递[重复]

智能指针(模拟实现auto_ptr,shared_ptr,scooeptr 以及定制删除器c++ 实现)