2016-05-09 9 views
-2

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); 
} 
+0

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. –

+0

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

+1

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). –

Antwort

1

Wenn schrieb folgendes:

delete trainArray[NUM_TRAINS]; 

Ich bin mir ziemlich sicher, dass Sie dies bedeutete:

delete trainArray[i]; 

& hellip; insbesondere da die erste auf einem Array-Element bezieht, das tut nicht existieren.

Ich schlage vor, Sie verwenden eine nette std::vector stattdessen, so dass Sie nicht dumme Fehler wie diese machen können.

+0

Ich habe das vorher versucht und es hat nicht für mich funktioniert. Ich habe ein paar .h-Dateien, die ich veröffentlichen kann, wenn es hilft, das Problem herauszufinden. – oblagon

+0

Nein, mach einfach das, was ich gesagt habe. Wenn der offensichtlich korrekte Code "nicht für [Sie] funktioniert", dann müssen Sie uns in Ihrer Frage mitteilen, auf welche Weise das der Fall ist. –

+0

Wenn ich wüsste welchen Weg; Ich könnte es lösen. – oblagon

Verwandte Themen