C中的Free()函数在释放重新分配的数据时不会产生任何错误,但不会释放实际内容。可能是什么原因?

时间:2014-10-18 17:12:43

标签: c realloc

所以当我分配一些空间时遇到问题,然后我在递归函数中重新分配这个空间然后我尝试在递归函数之外释放这个空间。 Free()不会出现任何错误,但是当调试显示我执行free()后仍然有旧内容。 因此我得到的错误如下: 1. malloc: *对象0x100200868的错误:释放对象的校验和不正确 - 对象可能在被释放后被修改。 要么 对象0x100200000的2.malloc:* 错误:未分配被释放的指针 这可能是什么原因?

void printTrie(FILE *file, char *initialPath){

    initPath = initialPath;
    if(root.isParent == 0) return;
    char *buffer;
    char *freeCh;
    int *intArr = root.usedIndices;
    int bufferSize = 5;
    int realBufferSize = 0;

    int i = 0;

    for(i = 0; i < 36; i++){

        if(intArr[i] == 1){
            buffer = calloc(6, sizeof(char)); //<<<--- have error here after realloc was done inside recursive function
            freeCh = buffer;
            if(i > 9){
                *freeCh = i - 10 + 'a' ;
            }else{
                *freeCh = i + '0';
            }

            freeCh++;
            realBufferSize++;
            recPrint(file, &buffer, realBufferSize, bufferSize, freeCh, &root.children[i]);
            free(buffer); // <<---- try to free content here
        }
    }
}

void recPrint(FILE *file, char **buffer, int realBufferSize, int bufferSize, char *freeCh, NodePtr* temp){

    if(temp -> isParent == 0){ //no superwords in this branch anymore
        temp -> list = getFinalList(temp -> list);
        fprintf(file, "<list> %s\n", *buffer);
        printList(temp -> list, file);
        fprintf(file, "\n<list>\n");
        return;
    }

    if(temp -> isWord){
        temp -> list = getFinalList(temp -> list);
        fprintf(file, "<list> %s\n", *buffer);
        printList(temp -> list, file);
        fprintf(file, "<list>\n");

    }


    int *intArr = temp -> usedIndices;
    int i = 0;
    for(i = 0; i < 36; i++){
        if(intArr[i] == 1){
            if(i > 9){
                *freeCh = i - 10 + 'a' ;
            }else{
                *freeCh = i + '0';
            }
            realBufferSize++;
            if (realBufferSize >= bufferSize){
                *buffer = realloc(*buffer, (bufferSize + 10) * sizeof(char)); //<<--- realloc here
                if(buffer == NULL)
                    printf ("Realloc failed: %s\n", strerror(errno));
                bufferSize += 10;
            }
            freeCh++;
            recPrint(file, buffer, realBufferSize, bufferSize, freeCh, &temp -> children[i]);

            //now we need to remove all extra characters till the next turn
            freeCh--;
            realBufferSize--;
            *freeCh = '\0';
        }
    }
}

enter image description here

1 个答案:

答案 0 :(得分:3)

在你的程序中,你将两个与你分配的内存相关的指针传递给你的程序。一个是您分配的buffer指针的地址。另一个是指向缓冲区的指针freeCh

在递归函数中,后者重新分配到*buffer。但是,重新分配可能会返回与最初分配的指针不同的指针。发生这种情况时,freeCh不再指向有效的内存位置。然后,您编码修改freeCh处的内存,现在释放内存。

顺便提一下,当realloc()返回NULL时,它没有释放您尝试重新分配的原始指针。因此,您不应直接使用返回值realloc()覆盖要重新分配的指针。您应该使用临时变量,然后测试realloc()是否返回了有效指针。仅当realloc()成功时,才将此值分配给您重新分配的指针。