释放缓冲区导致无效读取

时间:2013-10-29 18:57:40

标签: c segmentation-fault buffer free

我将缓冲区作为文件中的长字符串。然后我将单词逐字添加到二叉树中作为节点。

如果我在不再使用缓冲区时尝试释放缓冲区,则会出现Segmentation故障。 Valgrind指出了很多“无效读取大小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
}

每个节点都会在树插入函数内为自己分配内存。

1 个答案:

答案 0 :(得分:0)

strtok将修改它获得的缓冲区并返回内部缓冲区中的指针。因此,当您将从pch返回的strtok存储到二叉树中时,它会保存buffer的一部分。然后,当您free(buffer) pch并且树中的值变为无效时,会导致无效的读取错误。

在将pch放入树之前复制{{1}}。如果可用,您可以使用strdup。如果不是它的版本here