C 如何释放主线程中线程函数分配的内存

C 如何释放主线程中线程函数分配的内存,c,memory-management,pthreads,free,C,Memory Management,Pthreads,Free,我已经在线程函数f1中分配了heap内存,该存储用于计算堆区域中的值,以便主函数可以看到它 以下是线程函数定义: void *f1(void *input){ int sum = (int*)malloc(sizeof(int)); /* Do calculation */ pthread_exit((void*)&sum); } 在上面的代码中,sum是堆分配的存储,其地址作为返回值传递给main()中的sum1 我joinm

我已经在线程函数
f1
中分配了
heap
内存,该存储用于计算堆区域中的值,以便主函数可以看到它

以下是线程函数定义:

void *f1(void *input){


        int sum = (int*)malloc(sizeof(int));
        /* Do calculation */   
        pthread_exit((void*)&sum);
}
在上面的代码中,
sum
是堆分配的存储,其地址作为返回值传递给
main()
中的
sum1

join
main()中的线程如下所示:

void *sum1;
pthread_join(tid1,(void**)&sum1);
int *ptr;
pthread_join(tid1, (void **)&ptr);
一旦检索到该值,我想
释放
分配的内存。 当我主要使用
free
时,它会抱怨像
munmap\u chunk():无效指针


我怎样才能明确而安全地
释放
这个内存?

你应该发回指针,而不是它的地址

pthread_exit(sum);
...
pthread_join(tid1, &sum1);
从要发回的线程函数(使用
return
pthread_exit()
)发送指针。
pthread\u join()
中,您希望获取此指针,但
pthread\u join()
的结果是一个整数,用于报告成功/失败。

然后,我们必须声明一个指针变量(
sum1
此处)来存储预期的结果,并为
pthread\u join()
提供该变量的地址,以便对其进行更新(同样,我们为
scanf()
提供地址以更新提取的变量).

代码中的问题是使用了强制类型转换。在C语言中,大多数情况下,指针强制转换表示错误的构造。值得注意的是,在本例中,如果构造使用正确,则不需要强制转换:

// no cast required because malloc returns void * and void * can be converted
// to a pointer to int without a cast
int *sum = malloc(sizeof (int));

// no cast required because int * can be converted to a void * without a cast
pthread_exit(sum);

void *sum1;

// no cast required because the address of void * is a void **!
pthread_join(tid1, &sum1);
唯一需要强制转换的地方是,如果现在将此
void*
值转换为
int*
内联:

int value = *(int *)sum1;
但您也可以通过赋值将其转换,而且,不需要强制转换:

int *value_ptr = sum1;
printf("The value was %d\n", *value_ptr);
free(value_ptr);
经验法则是,如果您比编译器更了解一些东西,比如“将此值截断为
uint8\t
”或“此空指针实际上指向
int
,但我不会将其分配给一个编译器以保存击键”,则强制转换是可以的,但通常不可以仅使警告静音


一些程序员编写的代码如下:

void *sum1;
pthread_join(tid1,(void**)&sum1);
int *ptr;
pthread_join(tid1, (void **)&ptr);

这样的代码并不严格符合标准,因为
int*
void*
是不兼容的类型,可能具有或不具有相同的表示形式,甚至大小,尤其可能彼此不别名。

您编写了
int sum
,我想这里需要一个指针。@prog fh。你是对的,这是一个打字错误,让我来纠正一下。请不要修复你的代码中那些对提问至关重要的错误