程序在将指针与NULL进行比较时崩溃

时间:2013-12-13 23:08:18

标签: c++ class pointers tree

 template<class item_type>
 struct node{
     item_type x;
     node<item_type> *left;
     node<item_type> *right;
     //functions
 };

 template<class item_type, class param>
 class Tree{
        node<item_type> *root;
    public:
        item_type Get_Item(param item);
        void Add_Item(item_type item);
        void Delete_Item(item_type item);

        //more functions

        Tree();
};


template<class item_type, class param>
Tree<item_type, param>::Tree()
{
    this->root = new node<item_type>;

    this->root->left=NULL;
    this->root->right=NULL;

}   

添加项目:

void Tree<item_type, param>::Add_Item(item_type item)
{

    node<item_type> newItem;
    newItem.x = item;
    node<item_type> *cur = root;
    node<item_type> *prev;

    if(cur->x==NULL)
        cur->x=item;

    int ifGreater;
    while(cur->left!=NULL || cur->right!=NULL)
    {
        if(item<cur->x)
        {
            ifGreater = 0;
            prev = cur;
            cur = cur->left;
        }
        else
        {
            ifGreater = 1;
            prev = cur;
            cur = cur->right;
        }
    }
    if(ifGreater==1)
        prev->right = &newItem;
    if(ifGreater==0)
        prev->left = &newItem;
}

此功能在cout<<1;

处出现问题
template<class item_type, class param>
    void Tree<item_type, param>::Delete_Item(item_type item)
    {
        node<item_type> *cur = root;
        node<item_type> *prev;

        int ifGreater;
        if(cur==NULL)
        {
            cout<<"Not found"<<endl;
            return;
        }

        while(cur!= NULL && (cur->left!=NULL || cur->right!=NULL))
        {   
            cout<<1; //crash occurs RIGHT before here as 1 is never printed
            if(item<cur->x)
            {
                //do something   
            }                              
        }

问题发生在cout<<1之前和int ifGreater;声明之后cout仅仅是为了测试它运行的位置和停止运行的位置。 我通过调用

运行此函数
int main()
{
     Tree<int,int> theTree;
     theTree.Add_Item(1); //so the tree isn't empty
     theTree.Delete_Item(1);
}

注意:程序甚至没有超过第一次迭代,不正确的内存处理(修复)不是这个特定错误的问题。

1 个答案:

答案 0 :(得分:1)

您在以下代码中有未定义的行为:

template <class item_type, class param>
void Tree<item_type, param>::Add_Item(item_type item)
{
    node<item_type> newItem;
    // ...
    if(ifGreater==1)
        prev->right = &newItem;
    if(ifGreater==0)
        prev->left = &newItem;       
}

上面,newItem是一个本地变量,当Add_Item退出时,您将保持指向该本地井的指针。这可能是导致坠机的原因。

此外,您从未初始化ifGreaternode<item_type> *prev;。同样,这会导致更多未定义的行为:

    if(ifGreater==1)
        prev->right = &newItem;
    if(ifGreater==0)
        prev->left = &newItem;       

你可能最终会引用一些随机内存。这是因为无法保证您的while循环执行,例如。考虑leftright都是NULL的情况。