c++ 比较指针与NULL时程序崩溃

lymgl2op  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(222)
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);
}

注:程序甚至没有通过第一次迭代,内存处理不当(已修复)不是此特定错误的问题。

omqzjyyz

omqzjyyz1#

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

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是一个 local 变量,当Add_Item退出时,在它过期后,您保留了一个指向该本地变量的指针,这可能是崩溃的原因。
此外,您从未初始化ifGreaternode<item_type> *prev;。同样,这会导致执行以下命令时出现更多未定义的行为:

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

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

相关问题