c++ 为什么这会给予大小为8的未初始化值的Use

myzjeezk  于 2023-03-25  发布在  其他
关注(0)|答案(2)|浏览(105)

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

gg0vcinb1#

未初始化值最可能的原因是您添加到delta_Ub->nextUb->U中至少有一个本身未初始化。即:

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

您希望Valgrind在foo未初始化时报告。不幸的是,这样做会产生太多的“误报”警告。
您可以在循环中插入对VALGRIND_CHECK_MEM_IS_DEFINED的调用(参见Valgrind用户手册),Valgrind将在delta_U变为未定义时发出信号。

mhd8tkvw

mhd8tkvw2#

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

int *p = (int *) malloc(t*(sizeof(int)+1));
memset(p,0,t*(sizeof(int)+1));

相关问题