Связанный список не освобожден, утечка памяти отсутствует - PullRequest
1 голос
/ 15 марта 2012

В настоящее время я играю со связанными списками и собрал следующий код для тестирования.

Во-первых, я хотел бы отметить, что я знаю о своей необычной настройке списка, это был просто тест, чтобы получить не перевернутый список. Моя настоящая «проблема» в том, что у меня не возникает утечек памяти после завершения программы, хотя я не освобождаю список. Я использую drmemory в Windows для анализа, и он всегда работал хорошо. Если я добавлю в этот код некоторые другие 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 ]

1 голос
/ 15 марта 2012

Причина, которую я могу придумать, заключается в том, что Item *items = NULL 'items' является глобальной переменной.Итак, что касается инструмента проверки утечки памяти, память все еще доступна из кода, поэтому можно предположить, что вам все еще нужна эта память.

Atleast IBM Rational Purify работает таким образом.В IBM Rational Purify вы можете выбрать опцию для отображения «Используемая память», и он будет отображать этот указатель и количество байтов, которыми он владеет.

Обратите внимание, что память считается утечкой, только когда нетпеременные-указатели, содержащие этот адрес, и он также не был освобожден.

Например:

int main()
{
  function();  
}

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

Теперь, в приведенном выше примере, как только вы вернетесь из функции, у вас не будет никакого способадля доступа к переменной ptr.Итак, память, выделенная для ptr, определенно потеряна

1 голос
/ 15 марта 2012

drmemory не отображает достижимые выделения по умолчанию, попробуйте запустить drmemory с опцией -show_reachable

...