17

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"ありません。この魔法の振る舞いは何ですか?

4

3 に答える 3

11

少しgblicを見ると、ipv6の場合のオブジェクトキャッチについてです(249行を参照)。

他のメンバーが説明しているように、「まだ到達可能」はそれ自体がエラーではありませんが、バグのある状況を隠す可能性があります。この場合、それは問題ではなく、厄介なものを隠す可能性のある何かについての警告です。

この警告はredhatにも報告されています

グーグルとubuntuではなく警告の理由は、グーグルがサーバーにipv6を展開し、ubuntuを展開していないためです。その後、キャッチは実行されません。あなたはそれをチェックすることができます:

nslookup -q=AAAA www.google.com
nslookup -q=AAAA www.ubuntu.com
于 2012-11-05T10:41:09.337 に答える
5

これはメモリリークではない可能性があります(技術的にはそうですが、心配する必要はありません)。ライブラリは、関数が後続の呼び出しで最初に呼び出されたときにメモリを割り当てることがあります。必要に応じて、valgrindにこれらのエラーを抑制させることができます。

FAQから:

「まだ到達可能」とは、プログラムにおそらく問題がないことを意味します。つまり、プログラムが持つ可能性のあるメモリを解放しませんでした。これは非常に一般的で、多くの場合合理的です。これらのレポートを表示したくない場合は、-show-reachable=yesを使用しないでください。

于 2012-11-05T10:21:30.970 に答える
2

「まだ到達可能」と書かれています。これはおそらく、ライブラリがキャッシュなどにメモリを割り当てており、それを解放したくないことを意味します。あなたはそれを安全に無視することができます、あるいは少なくともそれは単にそれがメモリリークであると言うよりも多くの分析を必要とします。

異なるホスト間に違いがある理由は誰もが推測します。おそらく、名前サーバーが異なれば、必要な作業の種類も異なります。

于 2012-11-05T10:25:28.493 に答える