free(): 无效指针:在 C++ 中

이경훈*_*이경훈 1 c++ tree

我制作了树数据结构,但是当我擦除
下面的对象问题内容时遇到问题:

* `./t' 中的错误:free(): 无效指针:0x00007ffd1df99400 *

???(核心转储)

源代码

主程序

#include<iostream>
#include"tree.h"
#include"point.h"


using namespace std;

template<class T>
void ShowIntData(Point<T> data)
{
    cout<<data.x<<" "<<data.y<<endl;
}

typedef Point<double> pd;

int main(void)
{
    BTreeNode<pd> bt1; bt1.make();
    BTreeNode<pd> bt2; bt2.make();
    BTreeNode<pd> bt3; bt3.make();
    BTreeNode<pd> bt4; bt4.make();

    bt1.SetData(pd(1,10));
    bt2.SetData(pd(2,20));
    bt3.SetData(pd(3,30));
    bt4.SetData(pd(4,40));

    bt1.MakeLeftSubTree(&bt2);
    bt1.MakeRightSubTree(&bt3);
    bt2.MakeLeftSubTree(&bt4);

    bt1.InorderTraverse(ShowIntData);
    cout<<endl;

    bt1.PreorderTraverse(ShowIntData);
    cout<<endl;

    bt1.PostorderTraverse(ShowIntData);
    cout<<endl;

    bt1.DeleteTree(); // Error occurred
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

点.h

#ifndef __T_POINT_H__
#define __T_POINT_H__

template<class T>
struct Point
{
    T x;
    T y;
    Point() : x(0),y(0){}
    Point(T x,T y) : x(x),y(y) {}
};

#endif
Run Code Online (Sandbox Code Playgroud)

树.h

#ifndef __B_TREE_H__
#define __B_TREE_H__
#include<iostream>
#include<cstdlib>
using namespace std;

template<class T>
class BTreeNode
{
    private:
        T data;
        BTreeNode<T>* left;
        BTreeNode<T>* right;
    public:
    typedef void VisitFuncPtr(T data);
        BTreeNode();
        BTreeNode<T>* make();
        ~BTreeNode();
        T GetData();
        void SetData(T data);
        BTreeNode<T>* GetLeftSubTree();
        BTreeNode<T>* GetRightSubTree();
        void MakeLeftSubTree(BTreeNode<T>* sub);
        void MakeRightSubTree(BTreeNode<T>* sub);
        void DeleteTree();

        void InorderTraverse(VisitFuncPtr action);  //?? ??
        void PreorderTraverse(VisitFuncPtr action); //?? ??
        void PostorderTraverse(VisitFuncPtr action); // ?? ??

};

template<class T>
BTreeNode<T>::BTreeNode()
{
    left = NULL;
    right = NULL;
}

template<class T>
BTreeNode<T>::~BTreeNode()
{
    cout<<"Destructor"<<endl;
}


template<class T>
BTreeNode<T>* BTreeNode<T>::make(void)
{
    left = NULL;
    right = NULL;
    return this;
}

template<class T>
T BTreeNode<T>::GetData()
{
    return data;
}

template<class T>
void BTreeNode<T>::SetData(T data)
{
    this->data = data;
}

template<class T>
BTreeNode<T>* BTreeNode<T>::GetLeftSubTree()
{
    return left;
}

template<class T>
BTreeNode<T>* BTreeNode<T>::GetRightSubTree()
{
    return right;
}

template<class T>
void BTreeNode<T>::MakeLeftSubTree(BTreeNode<T>* sub)
{
    if(this->left != NULL)
        delete this->left;
    this->left = sub;
}

template<class T>
void BTreeNode<T>::MakeRightSubTree(BTreeNode<T>* sub)
{
    if(this->right != NULL)
        delete this->right;
    this->right = sub;
}

template<class T>
void BTreeNode<T>::InorderTraverse(VisitFuncPtr action)
{
    if(this==NULL)
        return;

    left->InorderTraverse(action);
    action(data);
    right->InorderTraverse(action);

}

template<class T>
void BTreeNode<T>::PreorderTraverse(VisitFuncPtr action)
{
    if(this==NULL)
        return;
    action(data);
    left->PreorderTraverse(action);
    right->PreorderTraverse(action);
}

template<class T>
void BTreeNode<T>::PostorderTraverse(VisitFuncPtr action)
{
    if(this==NULL)
        return;
    left->PostorderTraverse(action);
    right->PostorderTraverse(action);
    action(data);
}

template<class T>
void BTreeNode<T>::DeleteTree()
{
    if(this==NULL)
        return;

    left->DeleteTree();
    right->DeleteTree();

    delete this; //Error occurred


}


#endif
Run Code Online (Sandbox Code Playgroud)

650*_*502 5

delete必须仅用于已在堆上分配的对象new

在您的代码中,所有 4 个节点都已在堆栈delete上分配,因此调用它们是导致“未定义行为”的无效操作。