Насколько я знаю, malloc()
(или любая функция выделения кучи) и free()
должны быть сопряжены. Я думал, что то же самое в многопоточных программах. Но похоже, что я не должен free()
переменная кучи, которая была размещена в другом потоке.
Когда я запускаю приведенный ниже код (в среде wsl ubuntu),
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void* thread_main(void* arg) {
int i = 0;
for (; i < *((int*)arg); i++) {
printf("thread running... %d\n", i);
}
char* msg = (char*)malloc(sizeof(char) * 50);
msg = "thread end\n";
return (void*)msg;
}
int main() {
pthread_t thread_id;
int thread_arg = 5;
void* thread_return;
pthread_create(&thread_id, NULL, thread_main, (void*)&thread_arg);
pthread_join(thread_id, &thread_return);
printf("thread returned message : %s", (char*)thread_return);
free(thread_return); // if I comment out this line, the program succeeds.
return 0;
}
Я получаю стандартный вывод
thread running... 0
thread running... 1
thread running... 2
thread running... 3
thread running... 4
thread returned message : thread end
munmap_chunk(): invalid pointer
Aborted (core dumped)
Однако, если я закомментирую часть free(thread_return);
, программа завершится успешно и не выдаст сообщение об ошибке сброса.
Итак, нет необходимости освобождать переменную кучи, созданную из другого потока? Или даже более того, неправильно ли освобождать переменную кучи, если она была создана из другого потока?