Утечка памяти getaddrinfo - программирование

Утечка памяти getaddrinfo

У меня есть этот код для получения информации о адресе IPv4:

struct addrinfo hints, *info = NULL;
char addr4[INET_ADDRSTRLEN];

memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_INET;

if (!getaddrinfo(argv[hostPara], NULL, &hints, &info)) {
    inet_ntop(AF_INET, &((const sockaddr_in *)info->ai_addr)->sin_addr, addr4, INET_ADDRSTRLEN);
}
if (info != NULL) {
    freeaddrinfo(info);
}

но если я тестировал argv [hostPara], это "www.google.com". Я получаю это от valgrind:

==3632== 168 bytes in 1 blocks are still reachable in loss record 1 of 1
==3632==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3632==    by 0x524B5B8: make_request (check_pf.c:249)
==3632==    by 0x524BA53: __check_pf (check_pf.c:342)
==3632==    by 0x5201134: getaddrinfo (getaddrinfo.c:2458)
==3632==    by 0x40186B: main (trace.cc:214)

и если argv[hostPara] "www.ubuntu.com", утечки памяти отсутствуют. Каково это магическое поведение?

4b9b3361

Ответ 1

Немного посмотрим gblic, об облове объекта в случае ipv6 (посмотрите строку 249).

Как объяснили другие участники, "все еще достижимый" не является самой ошибкой, но может скрывать некоторые ситуации с ошибками. В этом случае это не проблема, просто предупреждение о чем-то, что может скрыть что-то неприятное.

Это предупреждение также сообщается redhat

Причина предупреждения для google, а не для ubuntu it beacause, у google есть ipv6, развернутый на его серверах, а ubuntu нет, а затем улов не выполняется. Вы можете проверить это:

nslookup -q=AAAA www.google.com  and nslookup -q=AAAA www.ubuntu.com

Ответ 2

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

Из FAQ:

"все еще доступно" означает, что ваша программа, вероятно, хорошо - она ​​не бесплатна какую-то память, которую она могла бы иметь. Это довольно часто и часто разумно. Не используйте --show-reachable = yes, если вы не хотите видеть эти отчеты.

Ответ 3

В нем говорится: "все еще доступно". Вероятно, это означает, что библиотека выделяет некоторую память для кеша или что-то в этом роде и не хочет ее освобождать. Вы можете смело игнорировать его или, по крайней мере, нуждаться в большем анализе, чем просто говорить об утечке памяти.

Почему существует разница между разными хостами? Возможно, потому что разные серверы имен требуют работы различного типа.