为什么这会使用大小为8的未初始化值

Yot*_*tam 7 c++ valgrind

在我的代码中,我有一个以命名membrane函数命名的类,一个名为exciteMod()的函数decide()和一个名为的变量delta_U.第一行exciteMod()this->delta_U = 0.在decide()我有一个-delta_U(exp(-this->delta_U))的指数.导致错误使用大小为8的未初始化值.可能导致此错误的原因是什么?我没有关于delta_Uvalgrind中生成的任何错误.

编辑: 以下是代码的相关部分:

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*/
  }
}
Run Code Online (Sandbox Code Playgroud)

这是警告:

== 467 ==使用大小为8的未初始化值
== 467 ==在0x300B00D75D:__ ieee754_exp(在/lib64/libm-2.5.so)==
467 == by 0x300B022FA3:exp(在/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().

Emp*_*ian 11

未初始化值的最可能原因是,您添加的至少一个b->nextU或哪个本身未初始化.那是:b->Udelta_U

foo = 0;
foo += some_uninitialized_value;
if (foo)  // Valgrind warns here
Run Code Online (Sandbox Code Playgroud)

你希望Valgrind在foo变得未初始化时报告.不幸的是,这样做会产生太多"误报"警告,这些警告是切实可行的.

您可以在循环调用中插入VALGRIND_CHECK_MEM_IS_DEFINED(参见Valgrind用户手册),Valgrind将发出delta_U未定义的确切时刻.