1

次のコードで、初期化されていないバイトについて valgrind が報告するのはなぜですか?

#include <valgrind/memcheck.h>

class Test {
public:
    Test() {}
};

int main(int argc, char* argv[]) {
    Test a;
    VALGRIND_CHECK_VALUE_IS_DEFINED(a);
    return 0;
}

テストして初期化するメンバー変数を追加すると、出力はありません。

4

1 に答える 1

4

あなたの例では、「a」のサイズは 1 になります。

printf("%ld\n",sizeof(a)); => 1

sizeof()クラス内のデータのみを報告しますが、一意のクラスにはそれぞれ独自のアドレスが必要なため、パディング バイトが追加されます。valgrind が不平を言う理由は、コンパイラが任意の値に初期化する義務を負わないパディング バイトにアクセスしているためです。

クラスの最小サイズが 0 ではなく 1 である理由についてのコメントは、こちらを参照してください。

于 2012-04-21T09:14:15.750 に答える