我对C ++很新,我最近收到了一个使用模板创建自己的二进制搜索树的项目。目标是二叉树能够接收任何类型的数据。 我创建了2个类,Node(h,cpp),Tree(h,cpp)和一个主cpp。 由于某种原因,我得到所有时间访问违规 (可能来自析构函数,它正在获得一个损坏的值)。
...这是我的代码(它的全部内容因此更容易......) 。感谢...
template <typename T>
std::ostream& operator<<(std::ostream& output, const Tree<T>& tree)
{
if (!tree.getRoot())
return output;
Node<T> * temp=tree.getRoot();
Tree<T> tempL(temp->getL());
output<<tempL;
output<<temp->getValue();
output<<endl;
Tree<T> tempR(temp->getR());
output<<tempR;
return output;
}
#endif
#include "Tree.h"
void main ()
{
Node<int> *no=new Node<int>(7);
Tree<int> IntTree(no);
IntTree.insert(new Node<int> (5));
IntTree.insert(new Node<int> (0));
IntTree.insert(new Node<int> (4));
IntTree.insert(new Node<int> (5));
IntTree.insert(new Node<int> (12));
IntTree.insert(new Node<int> (7));
IntTree.insert(new Node<int> (1));
IntTree.insert(new Node<int> (14));
IntTree.insert(new Node<int> (7));
IntTree.insert(new Node<int> (51));
if(IntTree.exists(5.1))
cout<<IntTree;
}
答案 0 :(得分:1)
看起来问题是节点被删除了两次。在operator<<
的{{1}}内,您可以创建名为Tree<T>
和tempL
的两棵树。在操作员的身体末端,这些树木被摧毁。那些树的析构函数tempR
给予它们的节点。但是,这些节点不是他们要销毁的节点,因为它们也属于赋予delete
的树对象。在操作员调用结束时,流式传输的任何树对象现在指向已删除的节点。我已经注释了操作员的身体来说明我的意思:
operator<<
要解决此问题,您应该避免在template <typename T>
std::ostream& operator<<(std::ostream& output, const Tree<T>& tree)
{
if (!tree.getRoot())
return output;
Node<T> * temp=tree.getRoot(); // temp->getRoot() wil be deleted temp is destroyed
// this will also destroy temp->getL() and temp->getR()
// because of Node<T>'s destructor
Tree<T> tempL(temp->getL()); // will delete temp->getL() when tempL is destroyed
output<<tempL;
output<<temp->getValue();
output<<endl;
Tree<T> tempR(temp->getR()); // will delete temp->getL() when tempR is destroyed
output<<tempR;
// tempL and tempR are destroyed
return output;
}
中创建临时树。另外,请考虑使用std::shared_ptr和std::unique_ptr之类的智能指针来避免这些问题。