我在MySQL中创建了一个C++聚合UDF。我将从char*聚合UDF的最终函数返回MySQL。在void xxx_deinit(UDF_INIT initid)中,我释放函数使用的任何内存。我正在通过删除init->ptr来释放内存。
我的职责是:
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;函数中删除行:xxx_deinit(UDF_INIT * initid)时,我得到了所需的输出。但我猜这是错误的方法,因为它会导致内存泄漏。同样的语句:在返回类型为delete initid->ptr;的简单UDF情况下,char*不会生成错误。有人能告诉我我在这里做错了什么吗?任何帮助或建议都会有很大的帮助。提前谢谢。
有人能帮我解决这个问题吗。
发布于 2020-10-01 08:22:02
没有内存泄漏,因为"demo"是指向静态内存的指针。
您正在尝试delete一个指向new未分配的内存的指针。你的运行时完全有权爆炸。
最简单的解决方案是简单地删除deinit函数中的delete。如果您总是将一个静态字符串放在那里,那就足够了。
或者,您可以切换到ptr成员的内存的动态分配。在init功能中:
initid->ptr = strdup("demo");在deinit函数中:
free(initid->ptr);注意,我们使用free而不是delete,因为strdup使用malloc分配内存。永远不要越过new/delete和malloc/free!
https://stackoverflow.com/questions/64150812
复制相似问题