Как очистить память в c - PullRequest
       22

Как очистить память в c

1 голос
/ 26 декабря 2011

У меня есть следующая структура:

struct Node{
int *arr;
int *sol;
struct Node *Next;
};

Я создаю Node следующим образом:

Node* MyNode = (Node *)malloc(sizeof (struct Node));
MyNode->arr = malloc(sizeof(int)*N);
MyNode->sol=  malloc(sizeof(int)*N);

Затем я добавляю MyNode в связанный список. Как я могу освободить память для элемента в списке.
это правильно:

pop(){
   free(first->arr);
   free(first->sol);
   first=first->Next; 
}

Ответы [ 4 ]

4 голосов
/ 26 декабря 2011

Чтобы любой struct был узлом в linked-list, вам необходим self-referential structure variable, который должен быть объявлен как struct Node *next;

struct Node{
    int *arr;
    int *sol;
    struct Node *next;
}

Чтобы выделить память для узла связанного списка, вам необходимо:

/* allocate memory for a node */
struct Node * MyNode = (struct Node *)malloc((int)sizeof(struct Node));
if (MyNode == NULL) {
    printf("ERROR: unable to allocate memory \n");
    return 1;
}

/* allocate memory for the content of a node */
MyNode->arr = (int *) malloc((int)sizeof(int) * N);
if (MyNode->arr == NULL) {
    printf("ERROR: unable to allocate memory \n");
    return 1;
}

MyNode->sol = (int *) malloc((int)sizeof(int) * N);
if (MyNode->sol == NULL) {
    printf("ERROR: unable to allocate memory \n");
    return 1;
}

/* add the new node to a list by updating the next variable */
MyNode->next = ... 

Если вы не уверены в операциях, которые необходимо выполнить для удаления узла в связанном списке, вы можете использовать переменную temp, чтобы сделать то же самое проще.

pop()
{
    struct Node * temp = first;
    first = first->next;
    free(temp->arr);
    free(temp->sol);
    free(temp);
}

Правило большого пальца для free - для каждого malloc() должно быть free()

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

3 голосов
/ 26 декабря 2011

почти, вам нужно освободить сам узел:

pop(){
   Node* old_first = first;
   free(first->arr);
   free(first->sol);
   first=first->Next;
   free(old_first); 
}
1 голос
/ 26 декабря 2011

Это близко, но не правильно - у вас должно быть столько free с, сколько у вас malloc с.Вы забыли освободить самого Node.

Чтобы исправить это, добавьте временное:

Node *next = first->next;
free(first->arr);
free(first->sol);
free(first); 
first = next;
1 голос
/ 26 декабря 2011
pop(){
   free(first->arr);
   free(first->sol);
   Node* temp = first; //<========
   first=first->Next;
   free (temp);  //<=======
}
...