[ Thrash3d @ 14.01.2013. 11:35 ] @
Pozdrav,

Novi sam u C++, imam zadatak da napravim stablo za unos i brzu pretragu podataka. Ali, imam problema sa dealokacijom, kompajler mi daje gresku u funkciji destroy_tree: glibc detected. Takodjer, kako cu obrisati zone_id? Moze li mi neko pomoci? Ovo je moj kod:

Tree.h

Code (cpp):
#ifndef TREE_H
#define   TREE_H

#define NUM_ELEMS 74

#include <string>



struct node {
   
    int* zone_id;
    node* leaves [NUM_ELEMS];
   
    node() : leaves() {};

};


class Tree {

public:
    Tree();
    ~Tree();
   
    void insert (std::string, int);
    void destroy_tree();
    int* search_tree (std::string);
   
private:
   
    void insert (std::string, node**, int, int);
    void destroy_tree (node*);
    int* search (std::string, node**, int);
   
    node* root;

};



Tree.cpp

Code (cpp):
#include "Tree.h"
#include <iostream>

using namespace std;

Tree::Tree() {
   
    root = NULL;
}

Tree::~Tree() {
    destroy_tree();
}

void Tree::destroy_tree() {
    destroy_tree(root);
}

void Tree::destroy_tree(node* parent) {

     if ( parent != NULL ) {

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

void Tree::insert(string str, int zone_id) {
   
    int num=0;

    if (root != NULL)
        insert (str, &root, num, zone_id);
    else {
       
        root = new node;
       
        insert (str, &root, num, zone_id);
       
    }
   
}

void Tree::insert(string str, node** parent, int num, int zone_id) {
   
    int value;
   
   
    if (num < str.length()) {
       
        value = (int)str[num] - 48;
       
        if ((*parent)->leaves[value] != NULL)
       
            insert (str, &((*parent)->leaves[value]), num+1, zone_id);
       
        else {
           
            (*parent)->leaves[value] = new node;
           
            if (num == str.length() -1) {

                (*parent)->leaves[value]->zone_id = new int;
                *((*parent)->leaves[value]->zone_id) = zone_id;
               
            }
           
            else {
                insert (str, &((*parent)->leaves[value]), num+1, zone_id);
               
            }
           
        }

    }
   
}


int* Tree::search_tree (string str) {
   
    int num = 0;
   
    return search (str, &root, num);
   
}

int* Tree::search(string str, node** parent, int num) {
   
    int value;
   
    if (num < str.length()) {
       
        value = (int)str[num] - 48;

        if ((*parent)->leaves[value] != NULL  &&  num != str.length() -1) {

            return search (str, &((*parent)->leaves[value]), num+1);
           
           
        } else if (num == str.length() -1 && (*parent)->leaves[value] != NULL) {
           
            if ( (*parent)->leaves[value]->zone_id != NULL )
                return (*parent)->leaves[value]->zone_id;
           
            else
                return NULL;
               
        } else
            return NULL;
           
       
    } else
        return NULL;

}



Hvala!

[Ovu poruku je menjao Thrash3d dana 14.01.2013. u 13:22 GMT+1]

[Ovu poruku je menjao Thrash3d dana 14.01.2013. u 13:23 GMT+1]
[ the_tosic @ 14.01.2013. 11:48 ] @
Nemam trenutno vise vremena da pogledam sta ne valja. Al na prvi pogled ispravi ovo:
Code:
void Tree::destroy_tree() {
    destroy_tree(root);
    root = 0; // !!!!
}
[ Thrash3d @ 14.01.2013. 13:39 ] @
Uspio sam malo izolovati problem:

Code (cpp):
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) {
            cout<<"Deleting zone_id: "<<*(parent->zone_id)<<" - "<<parent->zone_id<<" - ";
            delete parent->zone_id;
            cout<<"OK\n";
        }
       
        delete parent;
        parent = NULL;
    }

}



Ovako izgleda output:

Code:
...
Deleting zone_id: 13021 - 0x3db3340 - OK
Deleting zone_id: 13021 - 0x3db36f0 - OK
Deleting zone_id: 13021 - 0x3db3aa0 - OK
Deleting zone_id: 13021 - 0x3db40b0 - OK
Deleting zone_id: 13021 - 0x3db4460 - OK
Deleting zone_id: 13021 - 0x3db4810 - OK
...


Program padne na brisanju zone_id, izbaci error: free(): invalid pointer: 0x00007fe16648b778. Pretpostavljam da se to desi pri kraju brisanja stabla. Pointer nije NULL ali ne pokazuje ni na sto, i onda padne prilikom ispisa.