2011-10-16 22 views
6

Ho un problema con i miei indicatori in C++ e sarebbe bello se qualcuno fosse in grado di condividere la loro esperienza con me!Comportamento puntatore imprevisto in C++

L'uscita sto ottenendo è:

1: 
2: 
END: C 
1:C 
2:E 
END: E 

L'uscita mi aspettavo è:

1: 
2: 
END: C 
1:C 
2:C 
END: E 

Il codice di rilevanza è questo:

mia test.cpp

tree.insert('C'); 
tree.insert('E'); 

L'interno Funzione rt:

template <typename T> pair<typename btree<T>::iterator, bool> btree<T>::insert(const T& elem) { 
    cout << "1:" << this->rbegin_->value() << endl; 
    btree_node<T> node(elem); 
    cout << "2:" << this->rbegin_->value() << endl; 
    rbegin_ = &node; 
    iterator itr; 
    pair<typename btree<T>::iterator, bool> p(itr, false); 
    cout << "END: " << this->rbegin_->value() << endl; 
    return p; 
} 

Il costruttore per btree_node (che è praticamente vuoto):

template <typename T> btree_node<T>::btree_node(const T& elem) : value_(elem), nextCont_(NULL), prevCont_(NULL), nextNode_(NULL), prevNode_(NULL) {} 

La classe btree ha una variabile privata:

btree_node<T>* rbegin_; 

Che è quello che sto modificando . rbegin_ è inizialmente impostato su un nodo vuoto nel costruttore btree con:

btree_node<T> end(NULL); 
rbegin_ = &end; 

Sembra che la mia costruttore di nodi, che non fa nulla, sta modificando il valore di rbegin-> valore() ....

Qualsiasi aiuto apprezzato.

+0

Spero tu stia seguendo la regola del Tre. –

+0

Ciao Als, scusa per la mia ignoranza, ma qual è la "regola del Tre"? Saluti. Cercherò sicuramente di seguirlo, se è davvero qualcosa di ragionevole da seguire :) – Mick

+1

verificarlo [cosa-è-la-regola-di-tre] (http://stackoverflow.com/questions/4172722/what- is-the-rule-of-three) –

risposta

6

l'avete ottenuto dalla fortuna:

1: 
2: 
END: C 
1:C  <--- Undefined. 
2:E 
END: E 

L'errore è qui:

template <typename T> pair<typename btree<T>::iterator, bool> btree<T>::insert(const T& elem) { 
    cout << "1:" << this->rbegin_->value() << endl; 
    btree_node<T> node(elem); /* LOCAL parameter, will be deleted when leaving scope*/ 
    cout << "2:" << this->rbegin_->value() << endl; 
    rbegin_ = &node; /* Pointing to a LOCAL parameter, when leaving the scope it will point to undefined memory. */ 
    iterator itr; 
    pair<typename btree<T>::iterator, bool> p(itr, false); 
    cout << "END: " << this->rbegin_->value() << endl; 
    return p; 
} 

Quindi:
A. allocare la memoria del "nodo" in modo dinamico (malloc o giù di lì).
B. Non so cosa stai cercando di fare, ma fai ogni inserto per sostituire la testa dell'albero con il nuovo valore e ignorando la vecchia testa (gratis?) ... Non penso che ti voglia desiderio di fare

+1

Grazie Roee, quel codice funzione inserito non fa nulla al momento. Originariamente avevo più codice scritto, ma quando ho notato questo bug, sono tornato indietro e ho rimosso tutto per scopi di debug. Grazie - proverò ad allocare dinamicamente il nodo, e spero che funzioni! Saluti! – Mick

+0

Grazie mille! Ho passato 3 ore a fantasticare su questo (considerando che forse qualche altra parte del mio codice stava causando il problema). Funziona perfettamente ora. – Mick

Problemi correlati