我目前正在玩链接列表,为了测试目的,我将以下代码放在一起。
首先我想指出,我知道我不寻常的列表设置,这只是一个测试,得到一个不倒置的列表。我现在的实际“问题”是,一旦程序终止,我似乎没有任何内存泄漏,尽管我没有释放列表。我在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
*/
}
答案 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分配的内存 肯定会丢失