c-未释放链表,缺少内存泄漏



我目前正在使用链表,为了测试目的,我已经编写了以下代码。

首先我想指出的是,我知道我不寻常的列表设置,这只是一个测试,以获得一个不倒置的列表。我现在的实际"问题"是,一旦程序终止,我似乎没有任何内存泄漏,尽管我没有释放列表。我在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("%sn", iter->name);
    }
    /*
        Output:
            Item1
            Item2
            Item4
    */
}

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

Atleast IBMRationalPurify就是这样工作的。在IBMRationalPurify中,您可以选择显示"Memory In use"的选项,它将显示这个指针和它所持有的字节数

请注意,只有当没有包含该地址的指针变量时,内存才会被视为泄漏,而且它还没有被释放。

例如:

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

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

drmemory默认情况下不显示可达分配,请尝试使用-show_reachable选项集运行drmemory

最新更新