c - 释放缓冲区导致无效读取

标签 c segmentation-fault buffer free

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

如果我在缓冲区不再使用时尝试释放缓冲区,则会出现段错误。 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 将修改它获得的缓冲区并返回 inside 该缓冲区的指针。因此,当您将 strtok 返回的 pch 存储到二叉树中时,它会保存 buffer 的一部分。当您然后 free(buffer) pch 并且树中的值变得无效时,导致您的无效读取错误。

复制pch,然后再将其放入树中。如果可用,您可以使用 strdup .如果不是,则有它的版本 here .

关于c - 释放缓冲区导致无效读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19666874/

相关文章:

objective-c - 如果 CGImageCreate 的数据提供者使用由应用程序创建的数组,那么对 CGImageCreate 的正确调用会是什么样子?

c - 省时的方法来检查数组中的数字是否具有公因子?

c - C 编程 K&R 练习 1-13

c++ - 分段故障

c - 没有输出的段错误

sockets - Node.js TCP 输入缓冲

audio - 网络音频缓冲区奇怪的行为

从 LPVOID 转换为全局变量 - C

c++ - 运行 'make check' GLIBC 时的链接问题

c - printf 命令导致段错误?