#c #mysql #mysql-udf
#c #mysql #mysql-udf
Вопрос:
Я создал агрегатный UDF MySQL на C . Я возвращаюсь char*
из конечной функции агрегата UDF MySQL. В void xxx_deinit(UDF_INIT initid)
я освобождаю любую память, используемую моей функцией. Я освобождаю память, удаляя init->ptr
.
Моя функция deinit:
extern "C" void xxx_deinit(UDF_INIT * initid)
{
delete initid->ptr;
}
В функции инициализации я 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*
.
Кто-нибудь может сказать мне, что я здесь делаю не так?
Любая помощь или предложения будут очень полезны.
заранее спасибо.
Кто-нибудь может помочь мне решить эту проблему.
Ответ №1:
Утечки памяти нет, как "demo"
и указателя на статическую память.
Вы пытаетесь получить delete
указатель на память, которая не была выделена new
. Ваша среда выполнения имеет полное право взорваться.
Самое простое решение — просто удалить delete
в вашей функции deinit . Если вы всегда будете помещать туда статическую строку, этого достаточно.
В качестве альтернативы вы можете переключиться на динамическое выделение памяти для ptr
члена. В функции инициализации:
initid->ptr = strdup("demo");
В функции deinit:
free(initid->ptr);
Обратите внимание, что мы используем free
вместо delete
, поскольку strdup
выделяет память с помощью malloc
. Никогда не пересекайте new/delete
и malloc/free
!
Комментарии:
1. итак, что вы предлагаете мне делать?
2. можете ли вы предложить мне что-нибудь, пожалуйста?
3. Добавлены два пути к моему ответу.
4. Что пробовал? Вы подключили отладчик? Где происходит сбой?
5. Нет, это явная утечка памяти. Вы выбросили единственную ссылку на выделенную память.