我目前正在使用链表,为了测试目的,我已经编写了以下代码。
首先我想指出的是,我知道我不寻常的列表设置,这只是一个测试,以获得一个不倒置的列表。我现在的实际"问题"是,一旦程序终止,我似乎没有任何内存泄漏,尽管我没有释放列表。我在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