0

C++ でツリーを削除するための destroy_tree 関数に問題があります。コンパイラは言う*** glibc detected *** <path>: free(): invalid pointer: 0x00007f37590d3778 ***。これが私のdestroy_tree機能です:

void Tree::destroy_tree(node** parent) {

if ( (*parent) != NULL ) {

    for (int i=0; i<NUM_ELEMS; i++) {
        destroy_tree( &((*parent)->leaves[i]) );
    }

    if ( (*parent)->zone_id != NULL ) {
        delete (*parent)->zone_id;
        (*parent)->zone_id = NULL;
    }

    delete (*parent);
    (*parent) = NULL;
}

そして、ここに構造があります:

struct node {

    int* zone_id;
    node* leaves [NUM_ELEMS];

    node() : leaves() {} //setting all leaves pointers to NULL

};

ポインターの初期化 (他の関数内):

    (*parent)->leaves[value]->zone_id = new int;
    *((*parent)->leaves[value]->zone_id) = zone_id;

どこがダメなのかさっぱり見えない…

4

1 に答える 1

0

試してみてください..この「if」には、再帰destroy_treeだけでなく、すべてのコードを含める必要があると思います

void Tree::destroy_tree(node** parent) 
{
if ( (*parent) != NULL )  //I think this "if" should be include all code Not only recursion destroy_tree
  {
    for (int i=0; i<NUM_ELEMS; i++) 
    {enter code here
        destroy_tree( &((*parent)->leaves[i]));
    }
   if ( (*parent)->zone_id != NULL )   //the (*parent) should not be NULL
    {
        delete (*parent)->zone_id;
        (*parent)->zone_id = NULL;
    }
    delete (*parent);  //the (*parent) should not be NULL
    (*parent) = NULL;
    }
}

下手な英語でごめんなさい

于 2013-01-07T10:54:00.893 に答える