2013-03-08 63 views
-2

在下面的程序中,我需要在哈希表,列表元素和唯一字上调用free()。我尝试了几件事情,但都是破坏程序或增加错误信息。一些尝试在评论和大胆。如何修复此程序中的内存泄漏

有没有人知道在哪里以及如何打电话免费?它作为指针被混淆了。

h_ptr *htable; 
int tsize; 


void new_table(int size) 
{ 
    tsize = size; 
    htable = (h_ptr *) calloc(size, sizeof(h_ptr)); 
    if (!htable) { 
    fprintf(stderr, "Couldn't allocate hash array, exiting\n"); 
    exit(1); 
    } 


    for(int i=0; i<size; i++) 
     { 
    htable[i]=NULL; 
     } 
} 
+6

您的问题中代码太多。你可以试试它吗? – alestanis 2013-03-08 19:18:19

+0

我们不是你的调试器,选择一个部分,并询问有关它的具体问题 – 2013-03-08 19:25:39

+0

你的问题已关闭(所以我不能“回答”),但浏览你的代码,我看到你做错了什么。两条适用于你的经验法则;首先,每次调用'malloc()'都应该有一个匹配的调用,只要你需要它,'free()'就会保持到内存中。你有一些函数在顶部调用malloc,在底部释放然后返回指针。不,这很糟糕。您将指针传回给调用者,然后调用者完全释放它。 – Mike 2013-03-08 20:02:50

回答

2

防止内存泄漏总是相同的。如果您已经动态地分配了一些内存,请将其删除。因此,如果您的功能使用malloc()某处也写free()某处以避免内存泄漏

+0

是的,但每次我尝试它时,它会破坏程序或给我更多的内存泄漏错误(使用Valgrind)。我不确定在哪里免费调用以及使用什么语法作为指针。我们在哈希表,列表元素和唯一字上调用free()。例如,我在哪里可以找到“结果”变量? – Damon 2013-03-08 19:57:20

+0

一个指针应该作为自由参数传递。它可以是任何东西的指针。其实原型是免费的(void *) – deeiip 2013-03-08 20:00:14

+0

是的,我试过“free((void *)htable);”(第二行,它增加了更多的内存泄漏。) – Damon 2013-03-09 01:34:32