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。你是对的,这是一个打字错误,让我来纠正一下。请不要修复你的代码中那些对提问至关重要的错误