deepeshdm3434 Ответов: 4

Когда использовать free() в C ? когда освобождать память кучи, а когда нет ?


Цитата:
Когда использовать метод free() в C. Ниже я указал Linkedlist , программа прекрасно работает evn, не освобождая память здесь ? Что здесь происходит ?
Когда я должен использовать метод free() или освободить память из кучи ?

#include "stdio.h"
#include "stdlib.h"

struct Node {
    int data;
    struct Node *next;
};

struct Node *head = NULL;

void insert(int data) {
    
    struct Node *newNode = malloc(sizeof(struct Node));
    
    if (head == NULL) {
        head = newNode;
        head->data = data;
        head->next = NULL;
    } 
    else {
        
        struct Node *temp = head;
        while (temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = newNode;
        newNode->data = data;
        newNode->next = NULL;
    }
}

void display() {
    
    if (head == NULL) {
        
        printf("LIST IS EMPTY!");
    } else {
        struct Node *temp = head;
        while (temp != NULL) {
            printf("%d\n", temp->data);
            temp = temp->next;
        }
    }
}

int main() {
    insert(11);
    insert(12);
    insert(13);
    insert(14);
    display();
}


Что я уже пробовал:

пробовал Гугл и другие интернет ресурсы

4 Ответов

Рейтинг:
2

W∴ Balboos, GHB

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

Весь фокус в том, чтобы знать, когда вы закончите с этим.

Если он находится в main(), то освободите его (по крайней мере) до конца программы (выход какой-то).

Если вы находитесь внутри функции, то отпустите ее, прежде чем вернуться из функции. Здесь есть два предостережения:
1) Если вы передаете указатель из функции, то вам нужно будет освободить его в вызывающем устройстве, когда, как всегда, вы закончите его использовать.
2) если ваш компилятор поддерживает функцию alloca () или что - то подобное, то вы используете ее для назначения памяти- она автоматически освобождается при возврате из вызова функции. (Я думаю, это потому, что он хранится в стеке, а не в куче, но я не уверен в этом пункте).

Как я уже отмечал в самом верху - вам нужно знать, когда вы закончите с памятью - не освобождая ее (т. е. free() ), скажем, например, в функции, вы будете продолжать захватывать новую память, и это может привести к сбою вашего приложения.


Рейтинг:
2

CPallini

Цитата:
Когда использовать метод free() в C. Ниже я указал Linkedlist , программа прекрасно работает evn, не освобождая память здесь ? Что здесь происходит ?
Когда процесс завершается, ОС автоматически освобождает всю выделенную ему память.


Цитата:
Когда я должен использовать метод free() или освободить память из кучи ?
Когда она тебе больше не понадобится.


Рейтинг:
1

Rick York

Вы должны освободить выделенную память, когда закончите использовать содержащиеся в ней данные. Для вашей программы это, по - видимому, будет после вызова функции display ().


Рейтинг:
1

Richard MacCutchan

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