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, dasstrace_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.