因此,当我分配一些空间,然后在递归函数内部重新分配此空间,然后尝试在递归函数外部释放此空间时,我遇到了一个问题。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';
}
}
}
在您的程序中,将与分配的内存相关的两个指针传递到程序中。一个是buffer
您分配的指针的地址。另一个是指向缓冲区的指针,称为freeCh
。
在您的递归函数中,您随后将其重新分配到*buffer
。但是,重新分配可能会返回与最初分配的指针不同的指针。发生这种情况时,freeCh
不再指向有效的内存位置。然后,您通过代码修改处的内存freeCh
,现在已释放了内存。
顺便说一句,当realloc()
return时NULL
,它没有释放您尝试重新分配的原始指针。因此,您不应使用返回值直接覆盖要重新分配的指针realloc()
。您应该使用一个临时变量,然后测试是否realloc()
返回了有效的指针。仅当realloc()
成功时,才将此值分配给您重新分配的指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句