为什么 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;
}
如果我添加一个成员变量来测试和初始化它,就没有输出。
为什么 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;
}
如果我添加一个成员变量来测试和初始化它,就没有输出。
在您的示例中,“a”的大小将为 1:
printf("%ld\n",sizeof(a)); => 1
sizeof()
只报告一个类中的数据,但由于每个唯一的类都必须有自己的地址,因此添加了一个填充字节。valgrind 抱怨的原因是您正在访问填充字节,编译器没有义务将其初始化为任何值。
有关为什么类的最小大小为 1 而不是 0 的评论,请参见此处。