如何处理错误:双重免费或腐败

时间:2014-05-29 17:34:39

标签: c++ double binary-tree

更新:removeNode代码修订。没有错误,可以运行,但没有输出。输出应该只是打印出main函数中的向量。我现在还在检查bug。非常感谢您的帮助。如果有人发现任何虫子,请告诉我。非常感谢。

=======================

我得到的错误是*** glibc detected *** ./bintree: double free or corruption (fasttop): 0x0000000000727060 ***

程序很简单,请执行以下步骤:

  • 找到二叉树的最小值;
  • 在矢量中记录最小值;
  • 删除树中具有最小值的节点;
  • 重复1-3,直到树空了。

树定义如下,语言为c ++

typedef struct myNode* LPNode;
typedef struct myNode Node;
struct myNode
{
  double key;

  LPNode Left; //left subtree
  LPNode Right; //right subtree
};

这是一个简单的删除节点功能,因为每次删除最小值。节点很像叶子,所以不那么复杂。 compareDouble(double a,double b)将返回true if a < b; false if a > b

    //delete a node
void removeNode(LPNode Root,double min)
{
    if(compareDouble(min,Root->key)) {
        if(Root->Left != NULL) 
            removeNode(Root->Left,min);
        else
            printf("Remove bug!\n");
    }else{
        //delete Root;
        //Root=Root->Right;
            LPNode tmp = MakeNewNode(Root->key);
        tmp->Left = Root->Left;
        tmp->Right = Root->Right;
            delete Root;
    Root=tmp->Right;
    }               
}

nmax初始化为0,sortedvector是一个矢量,其空间与树中的总节点一样大,min的初始值为99999.minValue将返回树的最小值。

    //call minValue to find the min key
    //record the min key in a vector
    //call removeNode to delete the Node
    //repeat till the tree is empty
    void problem1(LPNode Root,double* sortedvector,int& nmax)
    {
        double min = MAX;
        while(Root!=NULL)
        {
            sortedvector[nmax] = minValue(Root,min) ;
            nmax++;
            removeNode(Root,min);
        }
        printf("The tree is empty");
    }

1 个答案:

答案 0 :(得分:0)

std::unique_ptr用于节点而非LPNode更好。那么你甚至不必任何delete s,更不用说追逐它们所带来的错误了。在您Root之后,您的一个错误是使用delete

delete Root;
Root=Root->Right;

你需要更像的东西:

NewRoot = Root->Right;
delete Root;
Root = NewRoot;