2016-11-23 9 views
3

Say I объявил указатель на структуру и назначить его таНос(), используя это определениеC: Высвобождение памяти указателей на структуру

typedef struct node { 
    int info; 
    struct node *next; 
} NODE; 

Тогда где-то в коде я объявил два указатель на него

NODE *node1, *node2 = NULL; 

node1 = malloc(sizeof(NODE)); 
node2 = node1; 

Мой вопрос, я должен использовать "свободный()", чтобы освободить node2 так же, как люди всегда делают, чтобы nODE1 через бесплатно (node1). Что такое эффект присваивания node2 = node1;

Спасибо.

+1

node1 _is_ node2. Просто освободите одного из них не обоих, либо он рухнет. –

+0

'free' просто знает об адресе.Он не знает, какие переменные у вас есть, и не волнует, какие точки относятся к адресу памяти –

+0

@ Jean-FrançoisFabre. Итак, что я говорю, я также могу освободить node1 через бесплатный (node2), нет? –

ответ

6

Когда вы

node1 = malloc(sizeof(NODE)); 

у вас есть что-то вроде

 
+-------+  +-----------------------------+ 
| node1 | ---> | memory for a NODE structure | 
+-------+  +-----------------------------+ 

После выполнения задания node2 = node1 вы вместо этого:

 
+-------+ 
| node1 | -\ 
+-------+ \ +-----------------------------+ 
      >-> | memory for a NODE structure | 
+-------+ / +-----------------------------+ 
| node2 | -/ 
+-------+ 

Другими словами, у вас есть два указатели, указывающие на одинаковые память.

Попытка вызова free с использованием любой из двух переменных указателя приведет к аннулированию как указателей.

+1

Что ascii art ... – StoryTeller

+0

Спасибо за рисунок. Теперь ясно. –

1

Необходимо передать адрес malloc() и семью в free(), чтобы освободить выделенную память.

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

Вы не должны делать

node2 = node1; 
node2 = node2 +1; 

free(node2); 

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

free(node1) и free(node2) такие же в вашем случае

+0

ОК. Это означает, что мне просто нужно освободить одного из них. –

+0

@JamesReal Да, вы можете использовать один из них – Gopi

2

Вы освобождаете ни node1 ни node2. Вы освобождаете память, на которую указывают.

Имея это в виду, это должно стать понятно, почему вы должны назвать только free раз

1

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

Присвоение node2 = node1 только копирует этот адрес.

В результате free(node1) и free(node2) эквивалентны.