2011-10-16 17 views
6

Tengo un problema con mis punteros en C++, y sería genial si alguien pudiera compartir su experiencia conmigo.Comportamiento de puntero inesperado en C++

La salida que estoy recibiendo es:

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

La salida me esperaba es:

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

El código de relevancia es la siguiente:

mi test.cpp

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

El inse función de la temperatura ambiente:

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; 
} 

El constructor de btree_node (que es básicamente vacío):

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

La clase árbolB tiene una variable privada:

btree_node<T>* rbegin_; 

¿Qué es lo que estoy modificando . rbegin_ se establece inicialmente en un nodo vacío en el constructor árbolB con:

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

Parece que mi constructor de nodo, que no hace nada, está modificando el valor de rbegin-> valor() ....

Cualquier ayuda apreciada.

+0

Espero que estés siguiendo la regla de Tres. –

+0

Hola Als, disculpa por mi ignorancia, pero ¿cuál es "la regla de los Tres"? Saludos. Definitivamente intentaré seguirlo, si de hecho es algo razonable de seguir :) – Mick

+1

mira esto [what-is-the-rule-of-three] (http://stackoverflow.com/questions/4172722/what- is-the-rule-of-three) –

Respuesta

6

que lo tienes por suerte:

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

El error está aquí:

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; 
} 

Así:
A. asignar la memoria de "nodo" de forma dinámica (malloc o algo así).
B. No sé lo que estás tratando de hacer, pero haces cada inserto para reemplazar la cabeza del árbol con el nuevo valor e ignorando la cabeza anterior (¿gratis?) ... No creo que eso te quiera deseo hacer

+1

Gracias Roee, ese código de función de inserción en realidad no hace nada en este momento ... Originalmente tenía más código escrito, pero cuando me di cuenta de este error, volví y quité todo para propósitos de depuración. Gracias - Intentaré asignar dinámicamente el nodo, ¡y espero que eso funcione! ¡Saludos! – Mick

+0

¡Muchas gracias! Pasé unas buenas 3 horas preguntándome sobre esto (mientras consideraba quizás alguna otra parte de mi código estaba causando el problema). Funciona perfectamente ahora – Mick

Cuestiones relacionadas