Очень запутался по этому поводу. Я только начал изучать указатели и теперь решил пойти немного глубже и начать экспериментировать с потоками. Я пытаюсь передать указатель на поток, поэтому (после 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);
?