访问违规二进制搜索树模板

时间:2017-01-03 18:09:49

标签: c++ templates tree runtime-error

我对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;

}

1 个答案:

答案 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_ptrstd::unique_ptr之类的智能指针来避免这些问题。