首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除初始化->ptr、MySQL聚合函数(UDF)时失去与MySQL服务器的连接

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

Stack Overflow用户
提问于 2020-10-01 07:27:00
回答 1查看 143关注 0票数 0

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

我的职责是:

代码语言:javascript
复制
extern "C" void xxx_deinit(UDF_INIT * initid)
{
    delete initid->ptr;
}

在init函数中,我是这样初始化ptr的:

代码语言:javascript
复制
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服务器中。安装后,当我试图调用该函数时,会弹出如下错误消息:

代码语言:javascript
复制
Error Code: 2013. Lost connection to MySQL server during query

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

有人能帮我解决这个问题吗。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-01 08:22:02

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

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

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

或者,您可以切换到ptr成员的内存的动态分配。在init功能中:

代码语言:javascript
复制
initid->ptr = strdup("demo");

在deinit函数中:

代码语言:javascript
复制
free(initid->ptr);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64150812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档