我知道调试选项下的Visual Studio将使用已知值填充内存。 g ++(任何版本,但gcc 4.1.2最有趣)都有任何选择 用未识别的值填充未初始化的本地POD结构?
struct something{ int a; int b; };
void foo() {
something uninitialized;
bar(uninitialized.b);
}
我希望uninitialized.b
具有不可预测的随机性;显然是一个错误,很容易
发现是否已启用优化和警告。但只用-g编译,没有
警告。一位同事有一个案例,其代码与此类似,因为它
巧合的是有一个有效的价值;当编译器升级时,它开始失败。
他认为这是因为新的编译器将已知值插入到结构中
(很像VS填充0xCC的方式)。根据我自己的经验,它只是不同
随机值没有碰巧有效。
但现在我很好奇 - 是否有任何g ++设置可以让它填满 标准本来会说的内存应该是未初始化的?
答案 0 :(得分:4)
任何C ++编译器都可以使用以下语法将任何POD类型初始化为其“零”值:
int i = int();
float f = float();
MyStruct mys = MyStruct();
// and generally:
T t = T();
如果你想谈谈调试那是另一回事......
(顺便说一句,我认为在<调试模式下,VS将所有未初始化的内存初始化为0xCC,这样无论你跳到哪里(例如调用一个坏的函数指针)都没有碰巧是实际的程序代码/数据int3被引发。)
答案 1 :(得分:3)
我不认为gcc / g ++中存在这样的选项/功能。
例如,所有全局(和静态)变量都驻留在.bss
部分,该部分始终初始化为零。但是,为了兼容性,未初始化的部分放在.bss
中的特殊部分中。
如果您希望将它们归零,则可以将-fno-common
参数传递给编译器。或者,如果您需要基于每个变量,请使用__attribute__ ((nocommon))
。
对于堆,可以编写自己的分配器来完成所描述的内容。但对于堆栈,我认为没有一个简单的解决方案。
答案 2 :(得分:1)
我不相信g ++会检测到这样的所有情况,但Valgrind肯定会。