Waarom zou dit een gebruik van een niet-geïnitialiseerde waarde van grootte 8

In mijn code heb ik een klasse met de naam membranemet een functie met de naam exciteMod(), een functie met de naam decide()en een variabele genoemd delta_U. De eerste regel van exciteMod()is this->delta_U = 0. In decide()Ik heb een exponent van -delta_U(exp(-this->delta_U)). die een fout veroorzaakt gebruik van een niet-geïnitialiseerde waarde van maat 8. Wat kan dit veroorzaken? Ik heb geen fout over delta_Udie wordt gegenereerd in Valgrind.

bewerken:
Hier zijn het relevante segment van de code:

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*/
  }
}

Dit is de waarschuwing:

== 467 == Gebruik van niet-geïnitialiseerde waarde van maat 8
== 467 == bij 0x300B00D75D: __IEEEEAE754_EXP (in /lib64/libm-2.5.So)
== 467 == door 0x300B022FA3: EXP (in /lib64/libm-2.5.so)
== 467 == door 0x40bb9a: Membraan :: Bepaal () (membraan.cpp: 813)
== 467 == door 0x40EBB1: Membraan :: excitemod () (membraan.cpp: 639)
==467== door 0x413994: membraan::MCstep(int) (membraan.cpp:486)
==467== door 0x402767: hoofd (main.cpp:14)

Bewerken:
Ik had moeten vermelden dat de enige plaats waar ik decide()aanroep, zich in exciteMod()bevindt.


Antwoord 1, autoriteit 100%

De meest waarschijnlijke oorzaak van niet-geïnitialiseerde waarde is dat ten minste één van b->nextUof b->Udie u toevoegt aan delta_Uis zelf niet geïnitialiseerd. Dat is:

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

U wilt dat Valgrind meldt wanneer foo niet-geïnitialiseerd wordt. Helaas levert dit te veel “vals-positieve” waarschuwingen op om praktisch te zijn.

U kunt in uw lusaanroepen invoegen naar VALGRIND_CHECK_MEM_IS_DEFINED(zie Valgrind gebruikershandleiding), en Valgrind zal het exacte moment aangeven waarop delta_Uongedefinieerd wordt.


Antwoord 2

laten we zeggen dat je t aantal waarden hebt dat moet worden opgeslagen. gebruik dan dit:

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

Other episodes