Ich bekomme immer einen seg-Fehler beim Löschen von trainArray in meinem Code. Ich versuche alle Zeiger auf die Train-Objekte zu bekommen und lösche sie. Was mache ich hier falsch?Segfault beim Freigeben von Ressourcen
pthread_t tidArray[NUM_TRAINS];
Train* trainArray[NUM_TRAINS];
for (int i = 0; i < NUM_TRAINS; i++){
trainArray[i] = new Train(TRAIN_NAME_ARRAY[i],TRAIN_TRANSIT_TIME_MSECS[i]);
}
int trainInd = 0;
for(trainInd = 0;trainInd<NUM_NORTHERNLY_TRAINS;trainInd++){
pthread_create(&tidArray[trainInd],NULL,initiallyNorthernly,(void*)trainArray[trainInd]);
for(trainInd = NUM_SOUTHERNLY_TRAINS;trainInd<NUM_TRAINS;trainInd++){
pthread_create(&tidArray[trainInd],NULL,initiallySouthernly,(void*)trainArray[trainInd]);
}
for (int i = 0; i < NUM_TRAINS; i++){
trainArray[i] = NULL;
pthread_join(tidArray[i],(void**)&trainInd);
delete trainArray[NUM_TRAINS];
}
return(EXIT_SUCCESS);
}
Sie scheinen "löschend" dauerhaft auf einem Element nach dem Ende der Reihe von Zügen zu verwenden. Sie sollten wahrscheinlich 'delete trainArray [i];' in der Schleife verwenden. Sie sollten überprüfen, ob Sie neu verwenden und direkt löschen sollten - es wäre wahrscheinlich besser, wenn Sie es nicht tun würden. –
Ich habe das vorher versucht und es hat überhaupt nicht funktioniert. Ich kann die .h-Dateien posten, die damit zusammenhängen, wenn es hilft, das Problem zu finden. – oblagon
Möglicherweise gibt es andere Gründe, warum Sie Fehler haben - aber die Notation, die Sie gerade verwenden, ist definitiv falsch (IMO). Es würde helfen, wenn du einen MCVE ([MCVE]) gepostet hast. Sie würden eine minimale Version Ihrer Thread-Funktionen benötigen, aber es kann sein, dass Sie sie einfach für kurze Zeit (eine Sekunde) schlafen lassen und beenden können. Wenn Sie immer noch Probleme haben, können wir Ihnen helfen. Wenn Sie keine Probleme haben, wissen Sie, dass der eliminierte Code wahrscheinlich das Problem verursacht. Betrachte ['valgrind'] (http://valgrind.org/) - es funktioniert normalerweise bei der Diagnose von Speichermissbrauch (aber ich habe es nicht mit Multithreading verwendet). –