2011-10-16 11 views
6

में अप्रत्याशित सूचक व्यवहार मुझे सी ++ में मेरे पॉइंटर्स के साथ कोई समस्या हो रही है, और यह बहुत अच्छा होगा अगर कोई मेरी विशेषज्ञता को मेरे साथ साझा करने में सक्षम था!सी ++

उत्पादन मैं हो रही है:

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

उत्पादन मैं उम्मीद कर रहा था है:

मेरी test.cpp

:

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

प्रासंगिकता के कोड यह है

tree.insert('C'); 
tree.insert('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); 
    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) {} 

BTREE वर्ग के लिए एक निजी चर है:

btree_node<T>* rbegin_; 

कौन सा है कि मैं क्या कर रहा हूँ संशोधित । rbegin_ शुरू में साथ BTREE निर्माता में एक खाली नोड के लिए सेट है:

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

यह मेरी नोड निर्माता है, जो कुछ नहीं करता है की तरह लगता है, rbegin- का मूल्य संशोधित कर रहा है> मूल्य() ....

किसी भी मदद की सराहना की।

+0

आशा है कि आप तीन के नियम का पालन कर रहे हैं। –

+0

हाय अल, मेरी अज्ञानता के लिए खेद है, लेकिन "तीन का शासन" क्या है? सादर। मैं निश्चित रूप से इसका पालन करने की कोशिश करूंगा, अगर यह वास्तव में पालन करने के लिए कुछ उचित है :) – Mick

+1

इसे देखें [व्हाट्स-द-द-नियम-ऑफ-थ्री] (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; 
} 

तो:
ए "नोड" गतिशील (malloc या तो) की स्मृति आवंटित करें।
बी। मुझे नहीं पता कि आप क्या करने की कोशिश कर रहे हैं, लेकिन आप पेड़ के सिर को नए मूल्य के साथ बदलने और पुराने सिर को अनदेखा करने के लिए हर डालने (फ्री?) ... मुझे नहीं लगता कि यह आपको चाहिए करना चाहते हैं

+1

धन्यवाद रोई, जो फ़ंक्शन कोड सम्मिलित करता है वास्तव में इस समय कुछ भी नहीं करता है .. मूल रूप से मुझे अधिक कोड लिखा गया था, लेकिन जब मैंने यह बग देखा, तो मैं वापस चला गया और सब कुछ डिबगिंग उद्देश्यों के लिए हटा दिया। धन्यवाद - मैं गतिशील रूप से नोड आवंटित करने की कोशिश करूंगा, और उम्मीद है कि यह काम करता है! सादर! – Mick

+0

बहुत बहुत धन्यवाद! मैंने इस बारे में सोचने में 3 घंटे का अच्छा समय बिताया (जबकि मेरे कोड के कुछ अन्य हिस्से में समस्या का कारण बन रहा था)। अब पूरी तरह से काम करता है। – Mick