在我的代码中,我有一个名为membrane
的类,其函数名为exciteMod()
,函数名为decide()
,变量名为delta_U
。 exciteMod()
的第一行是this->delta_U = 0
。在decide()
中,我的指数为-delta_U
(exp(-this->delta_U)
)。导致错误使用大小为8的未初始化值。可能导致此错误的原因是什么?我在valgrind中生成的delta_U
没有任何错误。
修改 以下是代码的相关部分:
void membrane::exciteMod(){
this->delta_U = 0;
/* Do some stuff which does not directly affect this->delta_U*/
std::tr1::shared_ptr<bead> bit = this->beads.begin();
while (bit != this->nead.end()){
std::tr1::shared_ptr<bead> b = *bit++;
//calculate the doubles U and nextU on b, nothing here gives a warning in valgrind, anyhow U and nextU on b are always defined
this->delta_U += (b->nextU - b->U);
}
decide();
}
void membrane::decide(){
double r = P.r.ran3() // the random function from numerical recepies
double f = - this->delta_U;
if (r > exp(f)){ //this gives the warning even though delta_U is valid
/*stuff*/
}
}
这是警告:
== 467 ==使用大小为8的未初始化值 == 467 ==在0x300B00D75D:__ ieee754_exp(在/lib64/libm-2.5.so中)
== 467 == by 0x300B022FA3:exp(in /lib64/libm-2.5.so)
== 467 == by 0x40BB9A:membrane :: decision()(membrane.cpp:813)
== 467 == by 0x40EBB1:membrane :: exciteMod()(membrane.cpp:639)
== 467 == by 0x413994:membrane :: MCstep(int)(membrane.cpp:486)
== 467 == by 0x402767:main(main.cpp:14)
修改
我应该提到,我致电decide()
的唯一地方是exciteMod()
。
答案 0 :(得分:9)
未初始化值的最可能原因是,您要添加到b->nextU
的{{1}}或b->U
中至少有一个本身未初始化。那就是:
delta_U
你希望Valgrind在foo变得未初始化时报告。不幸的是,这样做会导致太多“误报”警告变得切合实际。
您可以在循环中插入foo = 0;
foo += some_uninitialized_value;
if (foo) // Valgrind warns here
的调用(请参阅Valgrind user manual),Valgrind会发出VALGRIND_CHECK_MEM_IS_DEFINED
未定义的确切时刻。
答案 1 :(得分:0)
让我们说您有t个需要存储的值。然后使用:
int *p = (int *) malloc(t*(sizeof(int)+1));
memset(p,0,t*(sizeof(int)+1));