删除 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/delete
和 malloc/free
!
我在 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/delete
和 malloc/free
!