Я продолжаю получать ошибку seg в delete trainArray в моем коде. Я пытаюсь получить все указатели на объекты Train и удалить их. Что я здесь делаю неправильно?Segfault при освобождении ресурсов
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);
}
Вы, кажется, настойчиво используете 'delete' для элемента, следующего за концом массива поездов. Вероятно, вы должны использовать 'delete trainArray [i];' в цикле. Вы должны проверить, следует ли использовать новые и удалить напрямую - возможно, было бы лучше, если бы вы этого не сделали. –
Я пробовал это раньше, и он вообще не работал. Я могу опубликовать файлы .h, которые идут с этим, если это поможет найти проблему. – oblagon
Могут быть другие причины, по которым у вас есть сбои, но нотация, которую вы в настоящее время используете, является окончательно неправильной (ИМО). Это поможет, если вы разместите MCVE ([MCVE]). Вам понадобится минимальная версия ваших функций потока, но может быть, вы можете просто спятить их на короткое время (подсечку) и выйти. Если у вас все еще возникают проблемы, мы можем помочь. Если вы не сталкиваетесь с проблемами, вы знаете, что устраненный код, вероятно, вызывает проблему. Рассмотрим ['valgrind'] (http://valgrind.org/) - он обычно творит чудеса, диагностирующие злоупотребление памятью (но я не использовал его при многопоточности). –