'a.out'出错:free():下一个大小无效(正常)

时间:2014-10-30 19:39:45

标签: c++ gcc file-io

我正在编写一个大型应用程序,我最近在那里包含了用于处理文件的新模块。它具有编写整数和字符串的简单功能,在Red Hat上经过测试是完美的。它完全符合我的要求。

这里是函数的实现:

int CFile_open(CFile* owner, char* filename, char* mode) {
    owner->file = fopen(filename, mode);
    if (owner->file == NULL) {
        return 0;
    } else {
        return 1;
    }
}

int CFile_close(CFile* owner) {
    if (owner->file == NULL) {
        return 0;
    } else {
        if (fclose(owner->file) ) {
            return 1;
        } else {
            return 0;
        }
    }
}

int CFile_writeInt(CFile* owner, int num) {
    if (owner->file == NULL) {
        return 0;
    } else {
        if (fwrite(&num, sizeof(int), 1, owner->file)) {
            return 1;
        } else {
            return 0;
        }
    }
}

int CFile_writeString(CFile* owner, char* str) {
    if (owner->file == NULL) {
        return 0;
    } else {
        char b = strlen(str);
        if (fwrite(&b, sizeof(char), 1, owner->file)) {
            for (int i=0; i<=b; i++) {
                fwrite(&str[i], sizeof(char), 1, owner->file);
            }
        } else {
            return 0;
        }
    }
}

这些函数正在包装函数中使用,然后在我的应用程序中执行 这是函数:

void fileWrite(void* data) {
    CList* list = (CList*)data;
    CNode* node = list->first;
    CData* info = NULL;
    CFile* f = (CFile*)malloc(sizeof(CFile));
    f->init = CFile_init;
    f->init(f);

    if (list->length == 0) {
        printf("%s\n", "The list is empty!");
        wait();
    } else {
        int i = 1;

        if (f->open(f, (char*)"./f", (char*)"w")) {
            while (node) {
                info = node->getData(node);

                if (f->writeInt(f, info->getNum(info))) {
                    if (f->writeString(f, info->getAdr(info))) {
                        if (f->writeString(f, info->getPh(info))) {
                            printf("%s%d\n", "Wrote item #", i);
                            i++;
                        } else {
                            printf("%s%d\n", "Error writing Phone of item #", i);
                        }
                    } else {
                        printf("%s%d\n", "Error writing Adress of item #", i);
                    }
                } else {
                    printf("%s%d\n", "Error writing Number of item #", i);
                }

                node = node->next;
            }
            if (f->close(f)) {
                printf("%s\n", "Wrote successfully");
                wait();
            }
        }
        free(f);
    }
}

问题点是函数最后的f->close(f) 如果我不关闭文件,一切都完美无瑕。但如果我这样做,我会收到以下错误:

*** Error in 'a.out': free(): invalid next size (normal): 0x0859c320 ***

然而,尽管应用程序崩溃,但它确实关闭了文件,并且我写入的信息是正确的并且没有损坏。

但我无法弄清楚为什么我会收到错误。我只关闭文件一次(正如您在函数中看到的那样),我也尝试评论free(f)行。
此外,如果我拨打fclose(f->file),我会收到同样的错误,因此这不是close()功能问题。

我假设应用程序的其余部分工作(并且在我添加函数之前工作)完全除了我关闭文件的行。

我提到RedHat的原因是因为它在那里工作得很好,但是当我在ArchLinux(也尝试过Debian)下重新编译它时 - 它不会关闭文件。在任何地方都使用相同的编译器版本。

如果重要的话我用g++编译它,但我对clang++也有同样的问题。

我也试过用valgrind运行它,它没有说文件,或者我找不到合适的密钥。也许你知道吗?

那么您对正在发生的事情以及如何解决这个问题有什么想法吗?我已经盯着代码了3个小时了,我无法理解我的生活。


测试用例:

info->getNum()返回整数“11”(在输入期间分配)
info->getAdr()返回动态分配的char数组“aa”(在输入期间分配和分配)
info->getPh()返回动态分配的char数组“bb”(在输入期间分配和分配)

我可以使用我的应用程序中的其他功能测试这些值,因此我100%确信它们是正确的。

然后我只是唤起fileWrite()函数。

1 个答案:

答案 0 :(得分:2)

乍一看:

CFile_writeString中出现了一个错误的错误。 for (int i=0; i<=b; i++)应在i<b处终止。 &str[b]将导致未定义的行为。

BTW,strlen的结果类型为size_t,而不是char

我不知道这是否是你问题的原因。