2011-10-16 31 views
6

Mam problem z moimi wskazówkami w C++ i byłoby wspaniale, gdyby ktoś mógł podzielić się ze mną swoją wiedzą!Nieoczekiwane zachowanie wskaźnika w C++

Wyjście Dostaję jest:

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

Wyjście Spodziewałem się:

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

Kod znaczenie jest następujące:

mój test.cpp

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

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

Konstruktor btree_node (który jest w zasadzie pusty):

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

Klasa btree posiada prywatny zmiennej:

btree_node<T>* rbegin_; 

czyli co mam modyfikowania . rbegin_ jest początkowo ustawiona na pustym węźle w konstruktorze btree z:

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

Wydaje się moim konstruktora węzła, który nic nie zmienia, modyfikuje wartość rbegin-> wartość() ....

Każda pomoc doceniona.

+0

Nadzieję, że przestrzegasz zasady Trzech. –

+0

Cześć Als, przepraszam za moją ignorancję, ale jaka jest "zasada Trzech"? Pozdrowienia. Zdecydowanie postaram się go podążać, jeśli rzeczywiście jest to coś sensownego do naśladowania :) – Mick

+1

Sprawdź to [co-jest-zasada-trzech] (http://stackoverflow.com/questions/4172722/what- to-the-rule-of-three) –

Odpowiedz

6

Załatwione przez traf:

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

Błędem jest tutaj:

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

Więc:
A. Przydzielanie pamięci "węzła" malloc lub dynamicznie (tak).
B. Nie wiem, co próbujesz zrobić, ale robisz każdą wstawkę, aby zastąpić głowę drzewa nową wartością i ignorujesz starą głowę (wolną?) ... Nie sądzę, że tego chcesz chciałbym to zrobić.

+1

Dzięki Roee, ten kod funkcji wstawiania w rzeczywistości nic nie robi w tej chwili. Pierwotnie miałem napisany więcej kodu, ale kiedy zauważyłem ten błąd, wróciłem i usunąłem wszystko dla celów debugowania. Dzięki - spróbuję dynamicznie przydzielać węzeł i mam nadzieję, że działa! Pozdrowienia! – Mick

+0

Dziękuję bardzo! Spędziłem dobre 3 godziny zastanawiając się nad tym (rozważając może jakiś inny fragment mojego kodu powodował problem). Działa teraz idealnie. – Mick

Powiązane problemy