无法正确释放堆上的已分配内存,由Valgrind

时间:2016-03-14 00:18:33

标签: c pthreads malloc free

我遇到了释放已分配内存的问题,似乎我的经验不足导致了这个致命的错误。

下面我有一个简单的代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *thread(void *arg) {
    return NULL;
}

int main() {
    pthread_t id;
    pthread_t *pid = malloc(10 * (sizeof(pthread_t)));
    for (int i = 0; i < 10; i++) {
        pthread_create(&id, NULL, thread, NULL);
        pid[i] = id;
    }
    free(pid); 
}

所以,显然free(pid)并没有释放我创建的10个线程,因此valgrind告诉我,我只释放了11个中的1个。我如何解放10个线程?

编辑:我想我需要存储10个线程的地址,然后在for循环中释放它们,如果我在这里正确的话?

编辑#2

我尝试了以下内容:

  for (int i = 0; i < 10; i++) {
      free(pid[i]);
  } 

但我收到此错误

/usr/include/stdlib.h:483:13: note: expected ‘void *’ but argument is of type ‘pthread_t’
 extern void free (void *__ptr) __THROW;

2 个答案:

答案 0 :(得分:3)

HEADER将在内部分配一些内存。如果pthread_create线程刚刚退出,则不允许创建的线程清理。因此,在程序退出时,某些已分配的内存仍未释放。这就是valgrind正在崛起的。要解决此问题,请确保主线程在main调用之前调用pthread_join等待所有线程退出:

free(pid)

答案 1 :(得分:2)

malloc()使用了额外的pthread_create()。您需要等待线程死亡才能释放它们,例如使用pthread_join()。你不能在他们身上打free()

例如:

#define _POSIX_C_SOURCE 200809L

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void* thread(void* arg)
{
    return NULL;
}

int main(){
    pthread_t id;
    pthread_t *pid = malloc(10 *(sizeof(pthread_t)));
    for(int i=0; i<10; i++) {
        pthread_create(&id, NULL, thread, NULL);
        pid[i] = id;
        pthread_join(id, NULL);
    }

    free(pid); 
}