2011-10-16 11 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'); 

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) {} 

のbtreeクラスは、プライベート変数があります:私は変更てるものですどの

btree_node<T>* rbegin_; 

を。 rbegin_は、最初にbtreeのコンストラクタで空のノードに設定されます、それは何もしません、私のノード・コンストラクター、のように思える

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

rbegin-の値を変更している>値()....

助けていただければ幸いです。

+0

希望あなたは3のルールに従っています。 –

+0

こんにちはアルズ、私の無知に申し訳ありませんが、 "三のルール"は何ですか?よろしく。それが本当に何か合理的な場合は、私は間違いなくそれに従うようにしようとします:) – Mick

+1

これをチェックアウト[何の - is-the-the-rule-of-three](http://stackoverflow.com/questions/4172722/what- is-the-the-rule-of-three) –

答えて

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

関連する問題