свободный внутренний поток вызывает ошибку сегментации - PullRequest
2 голосов
/ 06 августа 2011

Очень запутался по этому поводу. Я только начал изучать указатели и теперь решил пойти немного глубже и начать экспериментировать с потоками. Я пытаюсь передать указатель на поток, поэтому (после malloc ing data) я вызываю:

pthread_create(&ptThread, &ptAttr, newClient, (void *) data);

Внутри функции newClient я делаю то, что мне нужно, и я решил (так как был выделен указатель) освободить ее:

void *newClient(void *v) {
    // ...stuff happens here...

    free(v);
}

В части free(v); я получаю ошибку сегментации. Так что я использовал valgrind, и мне пришло в голову сказать, что это был недействительный free:

==1214== Invalid free() / delete / delete[]
==1214==    at 0x4023B6A: free (vg_replace_malloc.c:366)
==1214==    by 0x804F622: newClient (xxxxxx2.c:44)
==1214==    by 0x4032954: start_thread (pthread_create.c:300)
==1214==    by 0x4112E7D: clone (clone.S:130)
==1214==  Address 0x4 is not stack'd, malloc'd or (recently) free'd

Чтобы добавить в огонь, когда я выходил из программы, Вальгринд сказал мне, что у меня утечка памяти, потому что v не был free 'd:

==1214== 8 bytes in 2 blocks are definitely lost in loss record 1 of 1
==1214==    at 0x4023F50: malloc (vg_replace_malloc.c:236)
==1214==    by 0x804F453: main (xxxxxx1.c:94)

Мои вопросы - как это бесплатно? Есть что-то, чего я здесь не хватает? Мне нужно free(v);?

Ответы [ 2 ]

6 голосов
/ 06 августа 2011

Прежде всего, 0x4 не выглядит как действительный адрес.

==1214==  Address 0x4 is not stack'd, malloc'd or (recently) free'd

Я думаю, что происходит, что вы случайно меняете v.Это может быть из-за неосторожного memcpy / strcpy перезаписи стека newClient.

С другой стороны, обычно рекомендуется, чтобы и malloc, и free выполнялись в одном и том женить.Я слышал, что некоторые распределители разработаны таким образом, чтобы делать это более эффективно.

0 голосов
/ 06 августа 2011

Возможно, проблема уже в том месте, где вы malloc ваш data.Это проходит мимо неправильно (0x4 не правдоподобно), так что, вероятно, у вас уже были проблемы там.Распространенная ошибка - забыть включить заголовочный файл и иметь malloc, интерпретируемый как возвращающий int по правилам по умолчанию.

Приведение почти всегда скрывает программную или, что еще хуже, ошибку проектирования:

  • не приводите возвращаемое значение malloc.malloc возвращает void*, это совместимо с любым другим указателем типа данных
  • не приводите указатели к void*, как при вызове pthread_create.Все указатели типов данных без проблем конвертируются в void*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...