C ++中意外的指针行为

时间:2011-10-16 12:12:16

标签: c++ pointers b-tree

我的C ++指针存在问题,如果有人能够与我分享他们的专业知识,那就太棒了!

我得到的输出是:

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

我期待的输出是:

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

相关代码是:

my test.cpp

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-&gt; value()....的值。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分: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.我不知道你想要做什么,但是你用每个插入物替换树头上的新值并忽略旧头(免费?)......我不认为你想要的做。