2017-08-31 105 views
1

我使用realloc替換malloc時出錯。realloc:釋放對象的校驗和無效

下面的這段代碼在我的電腦上運行正常。

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; 
} 

我想改變mallocrealloc,但出現錯誤。

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; 
} 

它說

的malloc:***錯誤對象0x7fca64c02598:用於釋放對象不正確的校驗 - 對象被釋放後,可能被修改。

我不知道這兩個代碼片段之間有什麼區別,如果你知道是什麼原因導致錯誤,請告訴我!非常感謝你!

+0

注意,使用'realloc()的'等引起潛在的內存泄漏。 –

+3

在第一個代碼片段變量'newcap'中沒有初始化?! –

+2

.uniuuitive感覺情況Yoda另外 –

回答

0

更新代碼中缺少vec->cap =的錯誤肯定會導致對malloc()的各種調用以及調用代碼濫用數據的情況。

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; 
} 

而且更好測試對於分配成功

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

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

唯一的場景,我能想象這樣的錯誤消息是當你真正修改指針,例如

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

必須傳遞到free() MUST已經被malloc()/calloc()/realloc()返回的指針,傳遞任何其他指針,包括一個指針指向相同的數據,但在不同的位置,如x在上面的示例中是未定義的行爲