2017-08-31 59 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在上面的示例中是未定义的行为