Valgrind 检测到无法正确释放堆上分配的内存
Unable to properly free allocated memory on heap, detected by 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
线程刚刚退出,则不允许创建的线程有机会进行清理。因此,一些分配的内存在程序退出时仍未释放。这就是 valgrind 正在收集的内容。要解决此问题,请确保主线程通过在 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);
}
我在释放分配的内存时遇到问题,似乎是我的经验不足导致了这个致命错误。
下面我有一个简单的代码:
#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
线程刚刚退出,则不允许创建的线程有机会进行清理。因此,一些分配的内存在程序退出时仍未释放。这就是 valgrind 正在收集的内容。要解决此问题,请确保主线程通过在 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);
}