2016-05-09 2 views
-2

Я продолжаю получать ошибку 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); 
} 
+0

Вы, кажется, настойчиво используете 'delete' для элемента, следующего за концом массива поездов. Вероятно, вы должны использовать 'delete trainArray [i];' в цикле. Вы должны проверить, следует ли использовать новые и удалить напрямую - возможно, было бы лучше, если бы вы этого не сделали. –

+0

Я пробовал это раньше, и он вообще не работал. Я могу опубликовать файлы .h, которые идут с этим, если это поможет найти проблему. – oblagon

+1

Могут быть другие причины, по которым у вас есть сбои, но нотация, которую вы в настоящее время используете, является окончательно неправильной (ИМО). Это поможет, если вы разместите MCVE ([MCVE]). Вам понадобится минимальная версия ваших функций потока, но может быть, вы можете просто спятить их на короткое время (подсечку) и выйти. Если у вас все еще возникают проблемы, мы можем помочь. Если вы не сталкиваетесь с проблемами, вы знаете, что устраненный код, вероятно, вызывает проблему. Рассмотрим ['valgrind'] (http://valgrind.org/) - он обычно творит чудеса, диагностирующие злоупотребление памятью (но я не использовал его при многопоточности). –

ответ

1

Когда писал:

delete trainArray[NUM_TRAINS]; 

Я уверен, что вы имели в виду это:

delete trainArray[i]; 

& hellip; особенно видя, как первый один относится к элементу массива, который делает не существует.

Я предлагаю вам вместо этого использовать std::vector, чтобы вы не могли совершать такие глупые ошибки.

+0

Я пробовал это раньше, и это не сработало для меня. У меня есть несколько файлов .h, которые я могу опубликовать, если это поможет выяснить проблему. – oblagon

+0

Нет, просто сделайте то, что я сказал. Если явно правильный код «не работает для [вас]», тогда вам придется рассказать нам в своем вопросе, каким образом это так. –

+0

Если бы я знал, каким образом; Я бы смог это решить. – oblagon

Смежные вопросы