質問によると、 getnameinfoによるメモリリークが発生しています。gccバージョン 4.6.3で Ubuntu 12.04 (Linux scv 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:42:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux) を使用しています。サーバーの実行可能ファイルをg++
にリンクしていますが、これまでのところ valgrind から問題は報告されていません。次に、 getnameinfoへの単純な呼び出しを追加して、接続しているクライアントのネットワーク名とポートを出力しました。
そして、私は次のようになります:
==4425== ==4425== ヒープ概要: ==4425== 出口で使用中: 1 ブロックで 10 バイト ==4425== 合計ヒープ使用量: 4,508 割り当て、4,507 解放、134,939,153 バイト割り当て ==4425== ==4425== 1 ブロックの 10 バイトは、1 の損失レコード 1 で確実に失われます ==4425== 0x4C2B6CD: malloc (/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so 内) ==4425== by 0x50D7D71: strdup (strdup.c:43) ==4425== by 0x1484B861: ??? ==4425== by 0x515B871: gethostbyaddr_r@@GLIBC_2.2.5 (getXXbyYY_r.c:256) ==4425== by 0x5161D06: getnameinfo (getnameinfo.c:223) ==4425== by 0x404175: solsrv_run (solsrv.c:381) ==4425== by 0x404DAC: メイン (main.c:167) ==4425== ==4425== リークの概要: ==4425== 確実に失われました: 1 ブロックで 10 バイト ==4425== 間接的に失われました: 0 ブロックで 0 バイト ==4425== 失われた可能性: 0 ブロックに 0 バイト ==4425== まだ到達可能: 0 ブロックに 0 バイト ==4425== 抑制: 0 ブロックに 0 バイト ==4425== ==4425== 検出され抑制されたエラーの数については、-v で再実行してください。 ==4425== エラーの概要: 11 のコンテキストから 12 のエラー (抑制: 2 から 2)
私は何を間違っていますか?
コードは単純に次のとおりです。
struct sockaddr addr;
socklen_t addr_sz = sizeof(addr);
char host[NI_MAXHOST],
serv[NI_MAXSERV];
int infd = accept(srv_fd, (struct sockaddr*)&addr, &addr_sz);
if (infd == -1) {
... manage error on accept ...
}
if(getnameinfo((struct sockaddr *)&addr, addr_sz, host, NI_MAXHOST, serv, NI_MAXSERV, NI_NUMERICSERV)) {
strncpy(host, "<unknown host>", NI_MAXHOST-1);
strncpy(serv, "<unknown port>", NI_MAXSERV-1);
}
そして、そこにリークがあります...リークが発生
していることを確認できます.6つのクライアントが接続されている場合、 valgrindは60バイトのリークを発見しました(クライアントは同じホストから接続していたと思うので、ホスト名に関連している場合、増加は線形です予想通り)。
何か案が?
乾杯