2016-07-16 2 views
0

я получил эти структуры:Как удалить связанный список, используя свободный

typedef struct tStimulus_tc 
{ 
    short    Key; 
    struct tStimulus_tc *Next; 

}Stimulus_tc; 

struct Frame_tc 
{ 
    int     ID;  // Frame ID (0..MAX) 
    int     Count; // Felt Count 
    short     sSize; // Stimulus List Size 
    Stimulus_tc   *sList; // Stimulus List 

}; 

, если я хочу, чтобы освободить «структура Frame_tc» достаточно ли это?

void freeFrame (Frame_tc *fTemp) 
{ 
    free(fTemp); 
} 

или мне нужно бежать через его стимул и бесплатно 1 на 1? Каков правильный способ освобождения переменной?

+2

Для каждого 'malloc' должен быть ровно один' free'. – user3386109

+0

Если это вопрос на C++, вы должны использовать 'new' и' delete', а не 'malloc()' и 'free()'. Или еще лучше коллекция. – EJP

+1

Почему этот отмеченный C++? – MrEricSir

ответ

2

free() принимает ранее выделенный блок и освобождает его для повторного использования. Он не знает и не заботится о содержимом буфера.

В то время как вы могли бы написать компилятор, который рекурсивно высвобождает указатели, это не очень хорошая идея:

static Stimulus_tc stim; 
Frame_tc *fTemp = malloc(sizeof *fTemp); 
fTemp->sList = &stim; 
fTemp->sSize = 1; 
free(fTemp); // if this recursively freed pointers, we would free a static object 

Только вы знаете, как устроена ваша структура, поэтому вам следует быть один разрушающие его. В вашем случае это означает прохождение связанного списка и освобождение каждого члена.

В C++ рекомендуется использовать механизмы более высокого уровня, например, используя std::vector<Stimulus_tc> или std::list<Stimulus_tc>.

В тех случаях, когда использование указателя неизбежно (ваш случай не один), рассмотрите возможность использования smart pointers. И если вы абсолютно должны управлять памятью по-старому, use type-safe new[]/delete[].

+0

Спасибо :) very helpfull – user3728181

+0

@ user3728181 Я упустил из виду, что 'sList' является связанным списком. Я соответствующим образом скорректировал ответ. Ответ Дэвида показывает, как освободить связанный список. – a3f

2

В C, если ваш Stimulus_tc список в struct Frame_tc обертке не традиционный голове/список хвоста (например, с окончательным ->Next = NULL), но с числом узлов, содержащимся в list->sSize, вы могли бы сделать что-то похожее на следующее:

/* free all nodes in struct Frame_tc->Stimulus_tc list */ 
void free_list (struct Frame_tc *list) 
{ 

    Stimulus_tc *iter = list->sList; /* pointer to iterate list */ 
    Stimulus_tc *victim = NULL;   /* pointer to node to delete */ 
    int n = list->sSize;    /* number of nodes to delete */ 

    if (iter == NULL) { 
     fprintf (stderr,"print_list() warning: empty list.\n"); 
     return; 
    } 

    while (n--) {  /* free n nodes */ 
     victim = iter; 
     iter = iter->Next; 
     free (victim); 
    } 
} 

Если вы установили окончательный NextNULL указатель, вы можете устранить int n = list->sSize; и просто итерацию по списку с while (iter) { ...

Если возникли дополнительные пои nter элементов в каждом выделенном узле, вы просто free эти значения до free (victim);

Посмотрите и сообщите мне, если у вас есть вопросы.

Смежные вопросы