2017-08-31 7 views
1

J'ai une erreur en utilisant realloc pour remplacer malloc.realloc: checksum invalide pour objet libéré

Ce code ci-dessous s'exécute correctement sur mon ordinateur.

int vector_grow(Vector* vec) { 
    unsigned long newcap; 
    int * newarr; 

    if (0 == vec->cap) { 
    vec->arr = (int*)malloc(START_CAPACITY * sizeof(*vec->arr)); 
    if (NULL == vec->arr) 
     return -1; 
    vec->cap = START_CAPACITY; 
    return 0; 
    } 
    newarr = malloc (newcap * sizeof(*vec->arr)); 
    if (NULL == newarr) 
    return -1; 

    memcpy (newarr, vec->arr, vec->len * sizeof(*vec->arr)); 
    free (vec->arr); 
    vec->arr = newarr; 
    vec->cap = newcap; 

    return 0; 
} 

Je veux changer le malloc à realloc, mais l'erreur se produit.

int vector_grow(Vector* vec) { 
    unsigned long newcap; 

    if (0 == vec->cap) { 
    vec->arr = (int*)malloc(START_CAPACITY * sizeof(*vec->arr)); 
    if (NULL == vec->arr) 
     return -1; 
    vec->cap = START_CAPACITY; 
    return 0; 
    } 
    newcap = 2 * vec->cap; 
    if ((vec->arr = (int*)realloc(vec->arr, newcap * sizeof(int))) == NULL) 
    return -1; 
return 0; 
} 

Il dit

malloc: *** erreur pour objet 0x7fca64c02598: contrôle incorrect pour objet libéré - objet a probablement été modifié après avoir été libéré.

Je ne connais aucune différence entre ces deux extraits de code, si vous savez ce qui cause l'erreur, s'il vous plaît dites-moi! Merci beaucoup!

+0

Notez que l'utilisation 'realloc()' comme ça provoque une fuite de mémoire. –

+3

dans la première variable d'extrait de code 'newcap' n'est pas initialisée du tout ?! –

+2

.Traitement intuitif des conditions Yoda Également –

Répondre

0

Bug dans manquant vec->cap = dans le code mis à jour certainement contribuer à divers appels à malloc() et l'abus de code d'appel de données.

int vector_grow(Vector* vec) { 
    unsigned long newcap; 

    if (0 == vec->cap) { 
    ... // not important to show the bug 
    } 
    newcap = 2 * vec->cap; 
    if ((vec->arr = (int*)realloc(vec->arr, newcap * sizeof(int))) == NULL) 
    return -1; 

    // Add missing update 
    vec->cap = newcap; 

    return 0; 
} 

également mieux tester pour l'allocation succès

void *p = realloc(vec->arr, sizeof *(vec->arr) * newcap); 
    if (p == NULL) { 
    return -1; 
    } 

    vec->arr = p; 
    vec->cap = newcap; 
0

Le seul scénario où je peux imaginer ce message d'erreur est lorsque vous modifiez en fait le pointeur, par exemple

int *x = malloc(2 * sizeof *x); 
if (x != NULL) { 
    x = x + 1; 
    free(x); 
} 

Le pointeur qui DOIT être transmis à free() MUST avait été renvoyée par malloc()/calloc()/realloc(), passer tout autre pointeur, y compris un pointeur sur les mêmes données, mais à une position différente comme x dans l'exemple ci-dessus est comportement indéfini.