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

问题描述 投票:7回答:2

在我的代码中,我有一个名为membrane的类,其中一个名为exciteMod()的函数,一个名为decide()的函数和一个名为delta_U的变量。 exciteMod()的第一行是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 ==通过0x300B022FA3:exp(在/lib64/libm-2.5.so中)== 467 ==通过0x40BB9A:film :: decide()(membrane.cpp:813)== 467 ==通过0x40EBB1:膜:: exciteMod()(membrane.cpp:639)== 467 ==通过0x413994:膜:: MCstep(int)(membrane.cpp:486)== 467 ==通过0x402767:main(main.cpp:14)

编辑:我应该提到的是,我呼叫decide()的唯一位置是在exciteMod()内部。

c++ valgrind
2个回答
11
投票

最可能的未初始化值是,您要添加到b->nextUb->Udelta_U中的至少一个本身未初始化。那是:

foo = 0;
foo += some_uninitialized_value;
if (foo)  // Valgrind warns here

您希望Valgrind在foo未被初始化时报告。不幸的是,这样做会产生太多“假阳性”警告,不切实际。

您可以将对VALGRIND_CHECK_MEM_IS_DEFINED的调用插入到您的循环调用中(请参阅Valgrind user manual,当delta_U变得不确定时,Valgrind将发出确切的信号。


0
投票

假设您有t个需要存储的值。然后使用这个:

int *p = (int *) malloc(t*(sizeof(int)+1));
memset(p,0,t*(sizeof(int)+1));
© www.soinside.com 2019 - 2024. All rights reserved.