【问题标题】:Unexpected Pointer Behaviour in C++C++ 中的意外指针行为
【发布时间】:2011-12-08 17:01:00
【问题描述】:

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

我得到的输出是:

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

我期待的输出是:

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

相关代码是这样的:

我的测试.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->value()....的值。

任何帮助表示赞赏。

【问题讨论】:

  • 希望你遵守三法则。
  • 嗨,Als,抱歉我的无知,但什么是“三法则”?问候。我肯定会尝试遵循它,如果它确实是合理的遵循:)

标签: c++ pointers b-tree


【解决方案1】:

你很幸运:

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.我不知道您要做什么,但是您每次插入都是用新值替换树头并忽略旧头(免费?)...我认为您不希望这样做做。

【讨论】:

  • 感谢 Roee,插入函数代码目前实际上并没有做任何事情。我最初编写了更多代码,但是当我注意到这个错误时,我回去并剥离了所有内容以进行调试.谢谢 - 我会尝试动态分配节点,希望它有效!问候!
  • 非常感谢!我花了 3 个小时来思考这个问题(同时考虑到我的代码的其他部分可能导致了问题)。现在完美运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多