在我的代码中,我有一个名为membrane
的类,它有一个名为exciteMod()
的函数,一个名为decide()
的函数和一个名为delta_U
的变量。exciteMod()
的第一行是this->delta_U = 0
。在decide()
中,我有一个指数-delta_U
(exp(-this->delta_U)
). which cause an error使用大小为8的未初始化值。我调用decide()
的唯一地方是在exciteMod()
内部。是什么原因导致的?我不知道在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== Use of uninitialised value of size 8
> ==467== at 0x300B00D75D: __ieee754_exp (in /lib64/libm-2.5.so)
> ==467== by 0x300B022FA3: exp (in /lib64/libm-2.5.so)
> ==467== by 0x40BB9A: membrane::decide() (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)
2条答案
按热度按时间gg0vcinb1#
未初始化值最可能的原因是您添加到
delta_U
的b->nextU
或b->U
中至少有一个本身未初始化。即:您希望Valgrind在foo未初始化时报告。不幸的是,这样做会产生太多的“误报”警告。
您可以在循环中插入对
VALGRIND_CHECK_MEM_IS_DEFINED
的调用(参见Valgrind用户手册),Valgrind将在delta_U
变为未定义时发出信号。mhd8tkvw2#
假设你有t个值需要存储。然后使用这个: