Simple C implementation to track memory malloc/free?

后端 未结 7 1492
情歌与酒
情歌与酒 2020-12-01 13:32

programming language: C platform: ARM Compiler: ADS 1.2

I need to keep track of simple melloc/free calls in my project. I just need to get very basic id

7条回答
  •  情歌与酒
    2020-12-01 13:50

    You could always use valgrind instead of rolling your own implementation. If you don't care about the amount of memory you allocate you could use an even simpler implementation: (I did this really quickly so there could be errors and I realize that it is not the most efficient implementation. The pAllocedStorage should be given an initial size and increase by some factor for a resize etc. but you get the idea.)

    EDIT: I missed that this was for ARM, to my knowledge valgrind is not available on ARM so that might not be an option.

    static size_t indexAllocedStorage = 0;
    static size_t *pAllocedStorage = NULL;
    static unsigned int free_calls = 0; 
    static unsigned long long int total_mem_alloced = 0; 
    
    void * 
    my_malloc(size_t size){
        size_t *temp;
        void *p = malloc(size);
        if(p == NULL){
        fprintf(stderr,"my_malloc malloc failed, %s", strerror(errno));
        exit(EXIT_FAILURE);
        }
    
        total_mem_alloced += size;
    
        temp = (size_t *)realloc(pAllocedStorage, (indexAllocedStorage+1) * sizeof(size_t));
        if(temp == NULL){
            fprintf(stderr,"my_malloc realloc failed, %s", strerror(errno));
             exit(EXIT_FAILURE);
        }
    
        pAllocedStorage = temp; 
        pAllocedStorage[indexAllocedStorage++] = (size_t)p;
    
        return p;
    }
    
    void 
    my_free(void *p){
        size_t i;
        int found = 0;
    
        for(i = 0; i < indexAllocedStorage; i++){
        if(pAllocedStorage[i] == (size_t)p){
            pAllocedStorage[i] = (size_t)NULL;
            found = 1;
            break;
            }
        }
    
        if(!found){
            printf("Free Called on unknown\n");
        }
    
        free_calls++;
        free(p);
    }
    
    void 
    free_check(void) {
        size_t i;
    
        printf("checking freed memeory\n");
        for(i = 0; i < indexAllocedStorage; i++){   
            if(pAllocedStorage[i] != (size_t)NULL){
                printf( "Memory leak %X\n", (unsigned int)pAllocedStorage[i]);
                free((void *)pAllocedStorage[i]);
            }
        }
    
        free(pAllocedStorage);
        pAllocedStorage = NULL;
    }
    

提交回复
热议问题