我正在测试pthread库,得到了以下代码:

for (int j = 0; j < NUM_THREADS; j++)
{
     int *threadNum = malloc(sizeof(int));
     *threadNum = j;
     pthread_create(..., (void *)threadNum);
}

由于没有空闲时间,此代码存在内存泄漏我应该放在哪里以避免内存泄漏?如果我只是写些类似的东西:
int *threadNum = 0;
*threadNum = j;

这会导致segfault。我不能将free放在范围内,因为我在接下来的几行中使用pthread_join。

最佳答案

当您不再使用分配的内存时,应该调用free。
可能是在连接之后,但是由于整数是在循环内分配的,所以需要在循环外保留一个引用。
与其单独分配整数,不如考虑在循环外部同时分配所有整数:

int *threadNums = malloc(sizeof(int) * NUM_THREADS)

for (int j = 0; j < NUM_THREADS; j++) {
  threadNum[j] = j;
  pthread_create(..., (void *)&threadNum[j]);
}

//something to ensure the threads are done using the memory

free(threadNums);

(没有测试语法错误,但希望您能理解)
特别注意评论。如果您的线程在调用free之前没有处理完内存,则会出现导致未定义行为的争用条件确保这一点的一种方法是连接所有线程。
或者,如果数据仅用于线程,则线程可能负责释放内存—在这种情况下,当线程函数不再需要时,您可以在指针上调用free。

10-07 13:44