destruktor- problem (oder evtl. was mit zeiger auf zeiger...)



  • hallo, ich habe folgende klasse:

    class Node {
    
    	private:	
    		vector<Node*> child_nodes;
    		bool is_end;
    
    	public:
    		Node() {
    			child_nodes.resize(26);
    			is_end = false;
    		}
    		~Node() {
    			child_nodes.clear();
    		}
    		Node* get_child_node(int index) {
    			return child_nodes[index];
    		}
    		void new_child_node(int index) {
    			child_nodes[index] = new Node();
    		}
    		void set_is_end() {
    			is_end = true;
    		}
    		void unset_is_end() {
    			is_end = false;
    		}
    		bool get_is_end() {
    			return is_end;
    		}
    		bool get_has_child() {
    			bool return_value;
    			return_value = false;
    			int i;
    			for (i = 0; i < 26; i++) {
    				if (child_nodes[i] != NULL) {
    					return_value = true;
    					break;
    				}
    			}
    			return return_value;
    		}
    
    };
    

    und folgenden weiteren code:

    void Trie::erase(vector<int> ascii_value) {
    	Node* temp_node;
    	vector<Node*> trace_nodes;
    	trace_nodes.resize(ascii_value.size());
    	bool found_node;
    	found_node = false;
    	temp_node = this->get_root();
    	int i;
    	for (i = 0; i < ascii_value.size(); i++) {
    		if (temp_node->get_child_node(ascii_value[i]) == NULL) {
    			found_node = false;
    			break;
    		} else {
    			found_node = true;
    			temp_node = temp_node->get_child_node(ascii_value[i]);
    			trace_nodes[i] = temp_node;
    		}
    	}
    	if (found_node == true && temp_node->get_has_child() == true && temp_node->get_is_end() == true) {
    		temp_node->unset_is_end();
    		cout << "Knoten mit Kind gefunden!\n";
    	} else if (found_node == true && temp_node->get_has_child() == false && temp_node->get_is_end() == true) {
    		cout << "Knoten ohne Kind gefunden!\n";
    		for (i = (ascii_value.size() - 1); i >= 0; i--) {
    			if (trace_nodes[i]->get_has_child() == false) {
    				cout << i << " hat kein kind\n";
    				trace_nodes[i]->~Node();
    			} else {
    				cout << i << " hat kind " << trace_nodes[i]->get_has_child() << "\n";
    				break;
    			}
    		}
    	} else {
    		cout << "Dieses Wort exisitiert im Trie nicht!\n";
    	}
    }
    

    (der trie ist ähnlich einem tree) es geht um den fall

    if (trace_nodes[i]->get_has_child() == false) {
    

    es ist
    trace_nodes[0]->child_nodes[0] = trace_nodes[1];
    trace_nodes[1]->child_nodes[1] = trace_nodes[2];
    trace_nodes[2]->child_nodes[2] = NULL;
    (alle anderen Kinder sind immer auch NULL)
    ich sehe also, dass

    trace_nodes[2]->get_has_child() == false;
    

    und zerstöre trace_nodes[2]. ich denke, dann sollte ja auch gelten

    trace_nodes[1]->get_has_child() == false;
    

    das ist aber komischerweise nicht so. kann mir einer sagen, warum?
    danke schon mal,

    marco



  • hallo,

    ich habe rausgefunden, dass es geht, wenn ich folgende Funktion zu Node hinzufüge

    void unset_child_node(int index) {
    			child_nodes[index] = NULL;
    		}
    

    und die erase- Funktion folgendermassen änder:
    [cpp]
    void Trie::erase(vector<int> ascii_value) {
    Node* temp_node;
    vector<Node*> trace_nodes;
    trace_nodes.resize(ascii_value.size());
    bool found_node;
    found_node = false;
    temp_node = this->get_root();
    int i;
    for (i = 0; i < ascii_value.size(); i++) {
    if (temp_node->get_child_node(ascii_value[i]) == NULL) {
    found_node = false;
    break;
    } else {
    found_node = true;
    temp_node = temp_node->get_child_node(ascii_value[i]);
    trace_nodes[i] = temp_node;
    }
    }
    /*wenn knoten gefunden
    und
    knoten hat kind
    und
    knoten ist wortende
    ==>
    knoten auf wortende nein setzen
    */
    if (found_node == true && temp_node->get_has_child() == true && temp_node->get_is_end() == true) {
    temp_node->unset_is_end();
    cout << "Knoten mit Kind gefunden!\n";
    /*wenn knoten gefunden
    und
    knoten hat kein kind
    und
    knoten ist wortende
    ==>
    von diesem knoten bis zum ersten {
    wenn knoten kein kind hat
    ==>
    zerstören
    }
    */
    } else if (found_node == true && temp_node->get_has_child() == false && temp_node->get_is_end() == true) {
    cout << "Knoten ohne Kind gefunden!\n";
    for (i = (ascii_value.size() - 1); i > 0; i--) {
    if (trace_nodes[i]->get_has_child() == false) {
    cout << i << " hat kein kind\n";
    trace_nodes[i]->~Node();
    trace_nodes[i - 1]->unset_child_node(ascii_value[i]);
    cout << trace_nodes[i] << "\n";
    } else {
    cout << i << " hat kind " << trace_nodes[i]->get_has_child() << "\n";
    break;
    }
    }
    } else {
    cout << "Dieses Wort exisitiert im Trie nicht!\n";
    }
    }
    [/cpp]
    Ich verstehe das aber alles immer noch nicht so richtig, kann mir einer erklären, was da vor sich geht?



  • Wo in dem Gewurstel nun der Fehler ist weiß ich auch nicht, aber Destruktoren ruft man eigentlich nicht direkt auf.


Anmelden zum Antworten