In mijn code heb ik een klasse met de naam membrane
met 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_U
die 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->nextU
of b->U
die u toevoegt aan delta_U
is 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_U
ongedefinieerd 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));