2012-03-15 49 views
1

我目前正在玩鏈接列表,並且爲了測試目的,我已經放在一起以下代碼。鏈接列表未釋放,缺少內存泄漏

首先我想指出,我知道我的不尋常的列表設置,這只是一個測試,以獲得一個不倒掛的名單。我現在的實際「問題」是,一旦程序終止,我似乎沒有任何內存泄漏,儘管我沒有釋放該列表。我在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用於播放鏈接列表。 – 2012-03-15 16:46:17

+0

似乎'prev-> next'在刪除第一個元素的過程中未被初始化。 – 2012-03-15 17:02:33

+0

@EAGER_STUDENT:你說得對,謝謝。在發佈之前,沒有真正考慮列表中只有一個項目的情況。 – Mars 2012-03-15 17:33:14

回答

1

究其原因,我能想到的是,Item *items = NULL「項目」是一個全局變量。所以,就內存泄漏檢查工具而言,內存仍然可以從代碼中訪問,所以它可能假設你仍然需要那個內存。

Atleast IBM Rational Purify以這種方式工作。在IBM Rational Purify中,您可以選擇顯示「正在使用的存儲器」的選項,它將顯示該指針和它保存的字節數。

請注意,只有在沒有包含該地址的指針變量且尚未釋放內存時纔會泄漏內存。

對於防爆:

int main() 
{ 
    function(); 
} 

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

現在,在上面的例子中,一旦你從函數返回,有沒有方法可以讓你訪問變量ptr。因此,分配給ptr的內存是絕對丟失了

+0

啊〜當然!對我沒有想到這一點感到羞恥。謝謝。 – Mars 2012-03-15 17:37:58

1

drmemory默認不顯示到達的分配,嘗試用-show_reachable選項運行drmemory設置

+0

感謝您的提示。 – Mars 2012-03-15 17:35:27