Ich habe derzeit Probleme mit einem Destruktor einer Klasse, die einen Vektor von Objekten enthält. Die Anwendung läuft zwar einwandfrei, beim Freigeben des Heap-Speichers wird jedoch ein Fehler ausgegeben. HierVector iterators inkompatibel: Laufzeitfehler
ist der Code meines destructor:
~StaticNetwork(void) { // clear memory
for(vector<Node*>::iterator iter = nodes.begin(); iter != nodes.end();)
nodes.erase(iter++);
}
Und Knoten an das Netzwerk werden wie folgt hinzugefügt:
if((temp = is_already_added(regex_d[1])) >= 0) // check if the src node has already been added
{
if((temp1 = is_already_added(regex_d[2])) >= 0) // check if the next_hop has already been added
{
nodes[temp]->add_n_vchannels(regex_d[5]);
nodes[temp]->add_next_hop(nodes[temp1]);
}
else // the next_hop has not been added
{
Node *anext_hop = new Node(regex_d[2]);
nodes[temp]->add_next_hop(anext_hop);
nodes[temp]->add_n_vchannels(regex_d[5]);
nodes.push_back(anext_hop); // add next hop
param.n_of_nodes++;
}
}
Das Netzwerk besteht aus Zeiger auf die aktuellen Knoten.
Jede Hilfe/Anregung/Referenz/(konstruktive) Kritik wird sehr geschätzt werden.
Danke. Das hat den Job gemacht. – Sebi
Es sollte auch beachtet werden, dass der Grund für den Fehler, den Sie erhielten, war, dass vector.erase Ihren Iterator ungültig gemacht hat. –
@Sebi: als Randnotiz - wenn Sie tatsächlich Vektorelemente in einer Schleife löschen möchten, die von einem Iterator abhängt, können Sie den nächsten gültigen Iterator nach der Operation 'radier()' mit 'iter = nodes.esase (iter) '. Um es klar zu sagen - das ist in dieser Situation nicht nützlich, aber in Zukunft, wenn Sie jemals 'nodes.erase (iter ++)' machen wollen, sollten Sie stattdessen den Rückgabewert von 'vector :: erase()' verwenden. –