如何清除c中的记忆

时间:2011-12-26 12:13:58

标签: c++ c memory linked-list free

我有一个结构如下:

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 个答案:

答案 0 :(得分:4)

要使任何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,要删除链接列表中的节点,请参阅this链接。

答案 1 :(得分:3)

差不多,你需要释放节点本身:

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

答案 2 :(得分:1)

pop(){
   free(first->arr);
   free(first->sol);
   Node* temp = first; //<========
   first=first->Next;
   free (temp);  //<=======
}

答案 3 :(得分:1)

它已接近但不正确 - 您应该拥有与free一样多的malloc s。你忘了释放Node本身。

要解决此问题,请添加临时:

Node *next = first->next;
free(first->arr);
free(first->sol);
free(first); 
first = next;