LinkedList - How to free the memory allocated using malloc

后端 未结 5 624
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-23 20:53

I have a very simple C code for constructing a Singly Linked list as below, in which I allocate memory for each node dynamically using malloc. At the end of code, I want to

5条回答
  •  余生分开走
    2020-12-23 21:01

    Content of Garbage Collector.h

    #include 
    #include 
    #define Stack struct _stack
    #define _MALLOC_S(type,num) (type *)_GC_malloc(sizeof(type)*num)
    #pragma pack(1)
    
    //Structure for adressing alocated memory into.
    
    Stack {
    
        int *adress_i;
        char *adress_c;
        float *adress_f;
        double *adress_d;
        Stack *next;
    };
    
    //Safe malloc
    
    void *_GC_malloc(size_t size)
    {
        void* ptr = malloc(size);
        if(ptr == NULL)
            return _GC_malloc(size);
        else
            return ptr;
    }
    
    //Push new element on Stack after every malloc
    
    void Add_New(int *i, float *f , double *d , char *c , Stack *p)
    {
        Stack *q =  _MALLOC_S(Stack,1);
    
            q->adress_i = i;
            q->adress_f = f;
            q->adress_c = c;
            q->adress_d = d;
    
            q->next = p->next;
            p->next = q;
            q = NULL;
    }
    
    //before ending program remove adresses that was allocated in memory, and pop entire Stack
    
    void Free_All(Stack *p)
    {
        //free head (dummy element)
        Stack *Temp = p->next;
        Stack *_free = p;
        free(_free);
    
        void *oslobodi;
    
        while(Temp != NULL)
        {
            _free = Temp;
            Temp = _free->next;
    
            if(_free->adress_i != NULL){
                oslobodi = _free->adress_i;
                free((int *)oslobodi);
            }
            else if(_free->adress_c != NULL){
                oslobodi = _free->adress_c;
                free((char *)oslobodi);
            }
            else if(_free->adress_f != NULL){
                oslobodi = _free->adress_f;
                free((float *)oslobodi);
            }
            else{
                oslobodi = _free->adress_d;
                free((double *)oslobodi);
            }
    
            free(_free);
        }
    
        _free = p = Temp;
    }
    
    /*  
        declare variable (var) and dinamicly alocate memory with simple macro, 
        and add to stack of linked list
    */
    
    #define obj_int(var)        int *var = _MALLOC_S(int,1);        *var = 0;   Add_New(var, NULL, NULL, NULL, Head); 
    #define obj_char(var)       char *var = _MALLOC_S(char,1);  *var = 0;   Add_New(NULL, NULL, NULL, var, Head);
    #define obj_float(var)      float *var = _MALLOC_S(float,1);    *var = 0;   Add_New(NULL, var, NULL, NULL, Head);
    #define obj_double(var)     double *var = _MALLOC_S(double,1);  *var = 0;   Add_New(NULL, NULL, var, NULL, Head);
    #define obj_struct(_type,_name) struct _type _*name = (struct _type *)malloc(sizeof(struct _type));
    
    #define _INIT_ROW(var,num)  for(int i = 0; i < num; i++) var[i] = 0;
    
    /*
        same, but for row!
    
    */
    
    #define row_int(var, num)   int *var =  _MALLOC_S(int,num);     _INIT_ROW(var,num)  Add_New(var, NULL, NULL, NULL, Head); 
    #define row_char(var, num)  char *var =  _MALLOC_S(char,num);       _INIT_ROW(var,num)  Add_New(NULL, NULL, NULL, var, Head);
    #define row_float(var, num) float *var =  _MALLOC_S(float,num);     _INIT_ROW(var,num)  Add_New(NULL, var, NULL, NULL, Head);
    #define row_double(var, num)    double *var =  _MALLOC_S(double,num);   _INIT_ROW(var,num)  Add_New(NULL, NULL, var, NULL, Head);
    #define string(var, value)  row_char(var, (strlen(value)+1)) strcpy(var, value);
    
    /* with this you create a Stack and allocate dummy element */
    
    #define Main(_type) _type main(void) { Stack *Head = _MALLOC_S(Stack,1); Head->next = NULL; Stack *_q_struct;
    
    /* with this macro you call function for dealocate memory (garbage collecting)*/
    
    #define End         Free_All(Head); }
    
    /*same thing for the other functions*/
    
    #define Function(name_function, _type, ...) _type name_function(##__VA_ARGS__) { Stack *Head = _MALLOC_S(Stack,1); Head->next = NULL;
    #define End_Ret(ret_var)            Free_All(Head); return (ret_var); }
    #define Call(name_function, ...)        name_function(##__VA_ARGS__)
    
    #define Define_Function(name_function, _type, ...) _type name_function(##__VA_ARGS__);
    

    Example of some_program.c P.S. header systemIO is group of more headers like this above! :)

    
    Main(void)          
    
         int num_elements = 10;
    
         row_int(row_elements, num_elements); //alocating row_elements object
    
         for(int i = 0; i < num_elements; i++)
              row_elements[i] = i; //initializing row_elements
    
    End //Garbage delete row_elements and end of program
    
    // row_int[0] = 0, row_int[1] = 1 .... 
    

提交回复
热议问题