删除 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/delete
和malloc/free
!
【讨论】:
那你建议我应该怎么做? 你能给我一些建议吗? 为我的答案添加了两种方式。 试过什么?你附加了调试器吗?它在哪里崩溃? 不,这是明显的内存泄漏。您丢弃了对已分配内存的唯一引用。以上是关于删除 initid->ptr、MySQL 聚合函数 (UDF) 时失去与 MySQL 服务器的连接的主要内容,如果未能解决你的问题,请参考以下文章
错误:使用已删除的函数‘std::unique_ptr<...> [关闭]
具有右值删除器的 unique_ptr 构造函数返回 null?
如何从 boost::ptr_vector 中删除“this”