链接列表未释放,缺少内存泄漏

时间:2012-03-15 16:42:44

标签: c malloc free

我目前正在玩链接列表,为了测试目的,我将以下代码放在一起。

首先我想指出,我知道我不寻常的列表设置,这只是一个测试,得到一个不倒置的列表。我现在的实际“问题”是,一旦程序终止,我似乎没有任何内存泄漏,尽管我没有释放列表。我在Windows上使用drmemory进行分析,它总能很好地工作。如果我在这段代码中放入其他一些malloc,它会注意到未释放的内存。为什么不注意清单?

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

// ----------------------

typedef struct Item
{
    char name[10];
    struct Item *next;
} Item;

Item *items = NULL;

Item *items_add(const char* name)
{
    Item *new = malloc( sizeof(Item) );
    strcpy(new->name, name);
    new->next = NULL;

    if(items == NULL)
    {
        items = new;
    }
    else
    {
        Item *iter = items;
        while(iter->next != NULL)
        {
            iter = iter->next;
        }

        iter->next = new;
    }

    return new;
}

void items_rem(const char* name)
{
    if(items == NULL)
        return;

    Item *iter = items, *prev;
    do
    {
        if(strcmp(iter->name, name) == 0)
        {
            prev->next = iter->next;
            free(iter);
            break;
        }

        prev = iter;
        iter = iter->next;
    }
    while(iter->next);
}

// ----------------------

int main(void)
{
    items_add("Item1");
    items_add("Item2");
    items_add("Item3");
    items_add("Item4");

    items_rem("Item3");

    for(Item *iter = items; iter != NULL; iter = iter->next)
    {
        printf("%s\n", iter->name);
    }

    /*
        Output:
            Item1
            Item2
            Item4
    */
}

2 个答案:

答案 0 :(得分:1)

默认情况下,drmemory不会显示可访问的分配,请尝试使用drmemory选项集

运行-show_reachable

答案 1 :(得分:1)

我能想到的原因是Item *items = NULL'items'是一个全局变量。因此,就内存泄漏检查工具而言,仍然可以从代码中访问内存,因此可能假设您仍然需要该内存。

Atleast IBM Rational Purify以这种方式工作。在IBM Rational Purify中,您可以选择显示“正在使用的内存”的选项,它将显示该指针及其所持有的字节数。

请注意,只有当没有包含该地址的指针变量并且尚未释放时,才会认为内存泄露。

对于Ex:

int main()
{
  function();  
}

int function()
{
   char *ptr = NULL;    
   ptr = malloc(10);     
   return 0;    
}

现在,在上面的示例中,一旦从函数返回,就无法访​​问变量ptr。因此,为ptr分配的内存 肯定会丢失