C++中指针的意外行为

6
我希望你能够帮我翻译关于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');

插入函数:

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()的值...

任何帮助都将不胜感激。


希望你遵循三法则。 - Alok Save
嗨Als,抱歉我的无知,但是什么是“三法则”?请问。谢谢。如果确实有道理,我一定会尝试遵循它 :) - Mick
1
看一下这个什么是三法则 - Alok Save
1个回答

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. 动态分配“node”的内存(使用malloc或类似方法)。
B. 我不知道您想要做什么,但您每次插入时都会用新值替换树头并忽略旧头部(free?)...我不认为这是您想要做的。


1
谢谢Roee,那个插入函数的代码目前实际上什么也不做...我最初写了更多的代码,但当我注意到这个错误后,我回去把所有东西都剥离出来进行调试。谢谢-我会尝试动态分配节点,希望能够解决问题!敬礼! - Mick
非常感谢!我花了好几个小时在这个问题上纠结(同时考虑到我的代码的其他部分可能会引起问题)。现在完美解决了。 - Mick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接