Утечка памяти в MySQL C API? - PullRequest
       17

Утечка памяти в MySQL C API?

3 голосов
/ 19 декабря 2011

Недавно я начал работать над программой на C, которая использует libmysqlclient. При проверке моего кода с помощью valgrind сообщалось об утечках памяти. Следующий минимальный фрагмент кода воспроизводит поведение:

#include <mysql.h>

int main(void)
{
    MYSQL* mysql = mysql_init(0);

    mysql_close(mysql);

    return 0;
}

Проверка полученной программы с помощью valgrind говорит мне:

==25614== LEAK SUMMARY:
==25614==    definitely lost: 0 bytes in 0 blocks
==25614==    indirectly lost: 0 bytes in 0 blocks
==25614==      possibly lost: 0 bytes in 0 blocks
==25614==    still reachable: 288 bytes in 3 blocks
==25614==         suppressed: 0 bytes in 0 blocks

Согласно справочнику MySQL API, mysql_close() ...

Закрывает ранее открытое соединение. mysql_close () также освобождает дескриптор соединения, на который указывает mysql, если дескриптор был автоматически выделен mysql_init () или mysql_connect ().

Однако valgrind сообщает о неосвобожденной памяти. Что здесь не так?

1 Ответ

6 голосов
/ 19 декабря 2011

Копаясь в документах, я нашел функцию mysql_library_end(), которая решает проблему.

Ссылка на MySQL API Reference:

Эта функция завершает работу библиотеки MySQL. Вы должны вызывать его, когда вы закончите использовать библиотеку (например, после отключения от сервера).

Что касается личной заметки, меня довольно раздражает, что libmysqlclient заставляет своих пользователей вызывать свою собственную функцию очистки. IMO, более удачным решением было бы автоматически вызывать mysql_library_end() всякий раз, когда число соединений падает до нуля.

...