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

时间:2011-08-17 19:20:41

标签: c++ valgrind

在我的代码中,我有一个名为membrane的类,其函数名为exciteMod(),函数名为decide(),变量名为delta_UexciteMod()的第一行是this->delta_U = 0。在decide()中,我的指数为-delta_Uexp(-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()

2 个答案:

答案 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));