Потерянное соединение с сервером MySQL при удалении initid-> ptr, агрегатной функции MySQL (UDF)

#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. Нет, это явная утечка памяти. Вы выбросили единственную ссылку на выделенную память.