Valgrind说我没有释放记忆,为什么呢?

时间:2017-04-27 16:50:44

标签: c data-structures valgrind

我有一个为链接列表中的一对分配内存的函数,当我运行时,valgrind说我没有释放内存。这是我的功能:

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

typedef struct{
int id;
char type;
}Pair;

typedef struct cel{
void *info;
struct cel *urm;
}Celula, *TLista, **ALista;


TLista assignPair(Pair p){

TLista new_entry = malloc(sizeof(Celula));
if (!new_entry){
    return NULL;
}

new_entry->info = malloc(sizeof(Pair));
if (!new_entry->info){
    free(new_entry);
    return NULL;
}

new_entry->urm = NULL;

((Pair*)new_entry->info)->id = p.id;
((Pair*)new_entry->info)->type = p.type;

return new_entry;

}

int main(){
Pair p;
p.id = 2;
p.type = 'c';
TLista a;
a = assignPair(p);
}

当我在main中使用assignPair(p)时,它会显示以下内容:

==4068== 24 (16 direct, 8 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2
==4068==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4068==    by 0x40057B: assignPair (in /home/vaduva/SD/2017/Tema2/example)
==4068==    by 0x40060B: main (in /home/vaduva/SD/2017/Tema2/example)

任何人都可以告诉我我在哪里犯了错误吗?我在这里阅读了valgrind手册:Link to valgrind man page

但这对我没有帮助。

2 个答案:

答案 0 :(得分:2)

Valgrind检查memory leaks。因此,当您为结构或函数分配内存时,不应再需要free the memory。在您的程序中,您使用malloc分配了两次并且没有释放分配的内存。

所以你应该释放在代码中创建的内存。

free(new_entry->info);
free(new_entry);

,即在您的代码中完全

int main() {
Pair p;
p.id = 2;
p.type = 'c';
TLista a;
a = assignPair(p);
free(a->info);
free(a);
}

请记住,释放内存的顺序也是因素,因为非法内存访问会出现分段错误。

答案 1 :(得分:1)

在主函数中,分配内存:

{
    a = assignPair(p);
} // leaked

在函数结束时,a超出了范围,它是指向该内存的最后一个指针。您需要提供freePair()功能,以便在仍可通过a访问时释放内存:

{
    a = assignPair(p);
    /* perhaps some other operations here */
    freePair(a);
}

freePair()的实施应该非常简单。