0

私はAVLツリーを構築しています。ツリー内のアイテムを削除する方法がありますが、エラーが発生します。

これは私が得る実行時エラーです:

malloc: *** error for object 0x100100120: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
jim Abort trap

私のクラスは次のようになります。

struct Avlnode{
string data;
int balfact;
Avlnode *left;
Avlnode *right;
};

class Avltree{
public:
Avltree();
~Avltree( );
Avlnode* insert(string i, bool* j);
static Avlnode* buildtree ( Avlnode *root, string data, bool *h ) ;
void display( Avlnode *root );
Avlnode* deldata ( Avlnode* root, string data, bool *h );
static Avlnode* del ( Avlnode *node, Avlnode* root, bool *h );
static Avlnode* balright ( Avlnode *root, bool *h );
static Avlnode* balleft ( Avlnode* root, bool *h );
void setroot ( Avlnode *avl );
static void deltree ( Avlnode *root );
private:
Avlnode *root;
int items;
};

そして、deldata は次のように定義されます。

Avlnode* Avltree::deldata ( Avlnode *root, string data, bool *h ){
Avlnode *node;

if ( root == NULL ){
    //cout << "\nNo such data.";
    return ( root );
}
else{
    if ( data < root -> data ){
        root -> left = deldata ( root -> left, data, h ) ;
        if ( *h )
            root = balright ( root, h ) ;
    }
    else{
        if ( data > root -> data ){
            root -> right = deldata ( root -> right, data, h ) ;
            if ( *h )
                root = balleft ( root, h );
        }
        else{
            node = root;
            if ( node -> right == NULL ){
                root = node -> left ;
                *h = true ;
                delete ( node ) ;
            }
            else{
                if ( node -> left == NULL ){
                    root = node -> right ;
                    *h = true ;
                    delete ( node ) ;
                }
                else{
                    node -> right = del ( node -> right, node, h ) ;
                    if ( *h )
                        root = balleft ( root, h ) ;
                }
            }
        }
    }
}
return ( root ) ;
}

Avlnode* Avltree :: del ( Avlnode *succ, Avlnode *node, bool *h ){
Avlnode *temp = succ ;

if ( succ -> left != NULL ){
    succ -> left = del ( succ -> left, node, h ) ;
    if ( *h )
        succ = balright ( succ, h ) ;
}
else{
    temp = succ ;
    node -> data = succ -> data ;
    succ = succ -> right ;
    delete ( temp ) ;
    *h = true ;
}
return ( succ ) ;
}

このエラーが発生するのはなぜですか?

4

1 に答える 1

3

tl;drしかし-メモリを管理するクラス+メモリ管理エラー->

デストラクタを実装しています。つまり、コピー/破棄ロジックには、シャローコピーで処理できる以上の機能があります。メンバーがいるので、これは理にかなっていますAvlnode *root;

RAIIを使用するか、コピーコンストラクタと代入演算子を適切に実装します。

これは三つのルールとして知られています。使用されるすべての用語は簡単にグーグル可能です。

于 2012-08-05T00:27:29.860 に答える