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

Nou*_*jik 3 c free memory-management pthreads

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

这是线程函数定义:

void *f1(void *input){


        int sum = (int*)malloc(sizeof(int));
        /* Do calculation */   
        pthread_exit((void*)&sum);
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,sum是为堆分配的存储,其地址作为返回值传递到sum1中的main()

join的线程main()是这样的:

void *sum1;
pthread_join(tid1,(void**)&sum1);
Run Code Online (Sandbox Code Playgroud)

一旦检索到该值,便要free分配的内存。当我free主要使用它时,它会抱怨munmap_chunk(): invalid pointer

free该如何明确和安全地存储此内存?

Ant*_*ala 5

您的代码中的问题是强制类型转换的使用。在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);
Run Code Online (Sandbox Code Playgroud)

唯一需要进行强制转换的地方是如果现在将此void * 转换为int *内联:

int value = *(int *)sum1;
Run Code Online (Sandbox Code Playgroud)

但是您也可以通过分配将其转换,然后再次不需要强制转换:

int *value_ptr = sum1;
printf("The value was %d\n", *value_ptr);
free(value_ptr);
Run Code Online (Sandbox Code Playgroud)

经验法则是,如果您知道比编译器更好的内容,则可以进行强制转换-例如“将值截断为uint8_t”或“此空指针实际上指向int,但我没有将其分配给一个以保存键击”-但是仅使警告静音通常是不行的。


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

int *ptr;
pthread_join(tid1, (void **)&ptr);
Run Code Online (Sandbox Code Playgroud)

这样的代码不严格符合作为int *void *不兼容的类型,可以具有或不具有相同的表示或大小均匀,特别是可以不互为别名。