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

尤汉·罗斯

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

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

在此处输入图片说明

x

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章