2011-10-16 73 views
6

我在C++中指向了一個問題,如果有人能夠與我分享他們的專業知識,那將會很棒!C++中的意外指針行爲

我得到的輸出是:

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

我所期待的輸出是:

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

相關的代碼是這樣的:

我TEST.CPP

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

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

爲btree_node的構造函數(這基本上是空的):

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

B樹類有一個私有變量:

btree_node<T>* rbegin_; 

這是我改變什麼。 rbegin_初始設置爲空節點在B樹構造器:

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

好像我的節點構造函數,它什麼也不做,正在修改rbegin-的值>值()......

任何幫助表示讚賞。

+0

希望你遵循三的規則。 –

+0

嗨,Als,對不起我的無知,但是什麼是「三的統治」?問候。我一定會試着去關注它,如果確實是合理的話:) – Mick

+1

檢查一下[what-the-the-rule-of-three](http://stackoverflow.com/questions/4172722/what-是三的規則) –

回答

6

你靠運氣得到它:

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

的錯誤是在這裏:

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

所以:
A.分配 「節點」 動態(的malloc或左右)的內存。
B.我不知道你在做什麼,但是你做了每一個插入,用新值代替樹頭,忽略舊頭(免費?)......我認爲這不需要你希望這樣做。

+1

感謝Roee,那個插入函數代碼現在實際上並沒有做任何事情..我原來寫了更多的代碼,但是當我注意到這個錯誤時,我回去把所有東西都去掉了,以便進行調試。謝謝 - 我會嘗試動態分配節點,並希望這有效!問候! – Mick

+0

非常感謝!我花了3個小時對此有所瞭解(同時考慮到也許我的代碼的其他部分導致了這個問題)。現在完美運作。 – Mick