我的缓冲区是一个来自文件的长字符串。然后我逐字添加到二叉树中作为节点。
如果我尝试释放不再使用的缓冲区,则会出现段错误。 Valgrind 指出了很多“Invalid read of size 1”错误。
如果我将它移到我的清洁支架上。它有效,但我遇到了严重的内存泄漏(因为程序可以读取更多文件)。
if (argc < 2) {
printf("No arguments was passed to proccess.\n");
return EXIT_SUCCESS;
} else {
for (int i = 1; i < argc; i++) {
FILE *file = openFile(argv[i]);
if (file != NULL) {
validFiles++;
// Get size of file and setting up a buffer
int fileSize = getFileSize(file);
buffer = calloc(fileSize + 1, sizeof(char));
fread(buffer,sizeof(char),fileSize,file);
fclose(file);
// Break down the buffer into a tree of nodes
pch = strtok (buffer,delimiters);
while (pch != NULL) {
root = insert(root, pch, argv[i], 1);
pch = strtok (NULL, delimiters);
} // free(buffer); should be here
}
}
}
if (validFiles > 0) {
searchBook(root);
freeTree(root);
free(buffer); // Only frees one of the buffers when multiple files are sent in
}
每个节点都会在树插入函数中为自己分配内存。
最佳答案
strtok
将修改它获取的缓冲区并返回该缓冲区内部 的指针。因此,当您将 strtok
返回的 pch
存储到您的二叉树中时,它会保存一部分 buffer
。然后当您 free(buffer)
pch
并且树中的值变得无效时,导致您的无效读取错误。
关于c - 释放缓冲区导致无效读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19666874/