Hallo und guten Morgen,
ich habe in meinem aktuellen Projekt ein Problem, dass an einer Stelle ein Element aus einem std::vector gelöscht wird, auf das in einer ganz anderen Funktion aber noch zugegriffen wird, weil es bei Einstieg in diese Funktion noch da ist. Durch verschiedene Ausgaben habe ich herausgefunden, dass die beiden Funktionen anscheinend nebenläufig ablaufen, obwohl mein Programm ohne Threads arbeitet, aber von aussen angestoßen werden kann.
Hier mal Teile des Codes:
Die andere Methode in der ebenfalls auf der Liste gearbeitet wird, aus der die Person gelöscht wird ist etwas zu lang um sie hier zu posten, deshalb nur ein kleiner Ausschnitt:
Guckt man sich die Ausgaben an, so sieht man, dass das die Löschen-Methode an sich vor dem Eintritt in die untere Methode angestoßen, aber nicht zu Ende ausgeführt wird, was dazu führt, dass ein vector element beim durchlauf der Schleife irgendwann verloren geht und ich einen Seg-Fault bekomme.
Kann mir einer eine schicke und saubere Methode sagen, das zu verhindern?
Gruß und Danke im Vorraus
Der Wolf
ich habe in meinem aktuellen Projekt ein Problem, dass an einer Stelle ein Element aus einem std::vector gelöscht wird, auf das in einer ganz anderen Funktion aber noch zugegriffen wird, weil es bei Einstieg in diese Funktion noch da ist. Durch verschiedene Ausgaben habe ich herausgefunden, dass die beiden Funktionen anscheinend nebenläufig ablaufen, obwohl mein Programm ohne Threads arbeitet, aber von aussen angestoßen werden kann.
Hier mal Teile des Codes:
Code:
void
PersonControl::updatePersons() {
// Erase all persons which are not updated
// for a while.
std::vector<Person*>::iterator it;
for (it = persons.begin(); it != persons.end();) {
uint64_t currentTime = PerceptTime::getCurrentTime();
uint64_t lastUpdate = (*it)->getLastUpdate();
if ((currentTime - lastUpdate) > MAXTIMEWOUPDATE) {
debug << "One person erased." << std::endl;
Person *person = (*it);
// Erase person from scene memory.
std::string xmlDoc = person->getXMLDoc();
if (xmlDoc != "") {
sceneControl->removeXMLDoc(xmlDoc);
inSceneMemory--;
}
// Erase person from list.
it = persons.erase(it);
// Delete person.
delete person;
debug << "Person completly removed." << std::endl;
} else {
it++;
}
}
}
Die andere Methode in der ebenfalls auf der Liste gearbeitet wird, aus der die Person gelöscht wird ist etwas zu lang um sie hier zu posten, deshalb nur ein kleiner Ausschnitt:
Code:
debug << "Number of persons: " << persons.size() << std::endl;
int currPerson = 0;
for (it = persons.begin(); it != persons.end(); it++) {
Person *person = (Person*) (*it);
if (person && assign[currPerson] >= 0) {
debug << "Number of persons: " << persons.size() << std::endl;
debug << "Person: " << currPerson << " gets percept " << assign[currPerson] << std::endl;
person->getAnchor(type).assignPercept(*(pList.getPercept(assign[currPerson])), TOPDOWN);
assigned[assign[currPerson]] = true;
debug << "Percept assigned." << std::endl;
// Update person in the active memory or insert it if it is not in memory.
int timesUpdated = person->getTimesUpdated();
if (timesUpdated == MINNUMOFUPDATES) {
std::string returnStr = sceneControl->strInsertToMemory(person->getDocument());
person->setXMLDoc(returnStr);
inSceneMemory++;
} else if (timesUpdated > MINNUMOFUPDATES) {
sceneControl->bReplaceWithDBXMLID(person->getDocument());
}
} else {
person->getAnchor(type).assignNoPercept();
}
currPerson++;
}
Guckt man sich die Ausgaben an, so sieht man, dass das die Löschen-Methode an sich vor dem Eintritt in die untere Methode angestoßen, aber nicht zu Ende ausgeführt wird, was dazu führt, dass ein vector element beim durchlauf der Schleife irgendwann verloren geht und ich einen Seg-Fault bekomme.
Kann mir einer eine schicke und saubere Methode sagen, das zu verhindern?
Gruß und Danke im Vorraus
Der Wolf