1

2 つの二分探索木が等しいかどうかをテストするコードを書いています。

ただし、メモリの割り当てを解除するたびに、アクセス違反エラーが発生します。調べてみると、解放関数でメモリ アドレス 0xfeefee にアクセスしていることがわかりました。Cell デストラクタ関数でアクセス違反が発生しています。

また、この機能が機能するかどうかはわかりませんが、そのために助けを求めているわけではありませんが、助けていただければ幸いです。

解放機能:

~Cell(void) {
    if (left) { delete left; }
    if (right) { delete right; }
}

関数:

bool BST::isEqualTo(const BST& that) const{
    if(root <= 0 && that.root <= 0){
        return true;
    }else if(root <= 0 || that.root <= 0){
        return false;
    }
    if(root->val != that.root->val){
        false;
    }
    /*Cell* saved_node1 = new Cell(*root);
    Cell* saved_node2 = new Cell(*that.root);*/
    BST a, b, c, d;
    a.root = root->left;
    b.root = that.root->left;
    c.root = root->right;
    d.root = that.root->right;
    if(a.isEqualTo(b) && c.isEqualTo(d)){
        /*a.root = saved_node1;
        b.root = saved_node2;
        c.root = saved_node1;
        d.root = saved_node2;*/
        return true;
    }
    return false;
}

ツリー デストラクタ:

void BST::destroy(void) {
    length = 0;
    delete root;
    root = nullptr;
}
4

1 に答える 1

1

したがって、コードのこの部分では

BST a, b, c, d;
a.root = root->left;
b.root = that.root->left;
c.root = root->right;
d.root = that.root->right;

BST関数が終了するとすぐに破棄されるオブジェクトを作成します。その後、ポインタに割り当てられたすべてのメモリrootが解放されます。

次のような別の比較関数を作成することをお勧めします。

bool _is_equal(Cell* c1, Cell* c2)
{
    if(c1 == nullptr && c2 == nullptr)
        return true;
    else if(c1 == nullptr || c2 == nullptr)
        return false;

    return  (c1 -> val == c2 -> val) &&
            _is_equal(c1 -> left,  c2 -> left) &&
            _is_equal(c1 -> right, c2 -> right);
}

そして、あなたの関数でそれを呼び出します

bool BST::isEqualTo(const BST& that) const
{
    return _is_equal(root, that.root);
}

そしてもちろん、operator==2 つのオブジェクトを比較するにはオーバーロードする必要があります。それはよりきれいに見えます。

于 2013-04-21T06:06:35.887 に答える