1

次の C++ ファイル pwd01.cpp があります。

#include <pwd.h>
#include <iostream>
int main() {        
    passwd* pwd = getpwuid(getuid());
}

これを次のコマンドでコンパイルします。

g++ pwd01.cpp -Wall -o pwd01

Ubuntu 12.04.1 LTS / gcc バージョン 4.6.3 では、valgrind がリークを報告します (以下を参照)。Mac OS 10.6.8 / gcc バージョン 4.2.1 で同じコマンドを使用して同じコードをコンパイルすると、valgrind はリークを報告しません。

passwd* を解放する必要がないことは承知しています(Linux で getpwuid() によって返されたポインターを解放する必要がありますか? )。それで、私は何が欠けていますか?

valgrind ./pwd01
==10618== Memcheck, a memory error detector
==10618== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==10618== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==10618== Command: ./pwd01
==10618== 
==10618== 
==10618== HEAP SUMMARY:
==10618==     in use at exit: 300 bytes in 11 blocks
==10618==   total heap usage: 68 allocs, 57 frees, 10,130 bytes allocated
==10618== 
==10618== LEAK SUMMARY:
==10618==    definitely lost: 60 bytes in 1 blocks
==10618==    indirectly lost: 240 bytes in 10 blocks
==10618==      possibly lost: 0 bytes in 0 blocks
==10618==    still reachable: 0 bytes in 0 blocks
==10618==         suppressed: 0 bytes in 0 blocks
==10618== Rerun with --leak-check=full to see details of leaked memory
==10618== 
==10618== For counts of detected and suppressed errors, rerun with: -v
==10618== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
4

2 に答える 2

2

「本当の」リークではないようです。つまり、数回呼び出された場合、リークは悪化しません。おそらく、メモリ領域への静的ポインタを保持し、NULL (初めて) の場合、それらの 60 バイトを割り当て、解放しません。

MacOS X バージョンは、真に静的な領域を使用するか、valgrindより優れたサプレッサーを備えています。

念のgetpwuidために、ループで数百回実行して、実際に 60 バイト (1200 ではなく) しかリークしないことを確認してください。

アップデート

私は最終的に、さまざまなサイズと説得力を持つnssswitch.cとの内部のいくつかの構造へのリークを追跡しました。コードは実際に必要な数よりも多くの割り当てを行っているように見えますgetXXent.c、malloc ロックが必要ですが、これは通常、パフォーマンスの点でそれほど重要ではありませ

于 2012-10-16T17:03:38.470 に答える
0

getpwuid()その(偽の)陽性を引き起こしているのは、それ自体ではないかもしれません。C ライブラリが起動時に初期化するものは他にもいくらでもありますが、その後プロセスの終了時に取り壊されません (プロセスがそのプロセスに属するすべてのマップされたメモリと共になくなるため、いくつかのことは失われます)。実際に破棄/未割り当てにする必要はありません)。別の回答が言ったように、特に提供した単純な例を超えてより多くのコードを作成する場合は、いくつかの追加のテストを実行し、数値が安定しており、独自のコードに直接起因するものではないことを確認してください。バグ レポートを提出する以外に、ライブラリ コードについて直接できることはあまりありません (とにかく、C ライブラリ開発者ではないことを前提としています)。

于 2012-10-16T17:14:01.303 に答える