Hashtable resizing leaks memory
        Posted  
        
            by 
                thpetrus
            
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by thpetrus
        
        
        
        Published on 2012-06-12T22:35:18Z
        Indexed on 
            2012/06/12
            22:40 UTC
        
        
        Read the original article
        Hit count: 336
        
I wrote a hashtable and it basically consists of these two structures:
typedef struct dictEntry {
    void *key;
    void *value;
    struct dictEntry *next;
} dictEntry;
typedef struct dict {
    dictEntry **table;
    unsigned long size;
    unsigned long items;
} dict;
dict.table is a multidimensional array, which contains all the stored key/value pair, which again are a linked list.
If half of the hashtable is full, I expand it by doubling the size and rehashing it:
dict *_dictRehash(dict *d) {
    int i;
    dict *_d;
    dictEntry *dit;
    _d = dictCreate(d->size * 2);
    for (i = 0; i < d->size; i++) {
        for (dit = d->table[i]; dit != NULL; dit = dit->next) {
            _dictAddRaw(_d, dit);
        }
    }
    /* FIXME memory leak because the old dict can never be freed */
    free(d); // seg fault
    return _d;
}
The function above uses the pointers from the old hash table and stores it in the newly created one. When freeing the old dict d a Segmentation Fault occurs.
How am I able to free the old hashtable struct without having to allocate the memory for the key/value pairs again?
© Stack Overflow or respective owner