C语言 无法正确释放堆上分配的内存,由 Valgrind 检测到



我在释放分配的内存时遇到了问题,似乎我的缺乏经验导致我犯了这个致命的错误。

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

#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;

pthread_create将在内部分配一些内存。如果main线程刚刚退出,则不允许创建的线程有机会进行清理。因此,一些分配的内存在程序退出时仍未释放。这就是瓦尔格林德正在拾取的东西。要解决此问题,请确保主线程在free(pid)调用之前调用pthread_join来等待所有线程退出:

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

额外的 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); 
}

相关内容

  • 没有找到相关文章

最新更新