c++ - 读取二进制文件时释放内存

标签 c++ c file memory fread

我有一个二进制文件,用于保存我的结构:

struct vec
{
    string author;
    string name;
    int pages;
    string thread;
    vec *next;
};

写入文件函数:

    void logic::WriteInfoToFile()
{
    if (first != NULL)
    {
        pFile = fopen(way.c_str(), "wb");
        if (pFile != NULL)
        {
            fseek(pFile, 0, SEEK_SET);
            temp = first;
            while (temp != NULL)
                {
                    WriteString(temp->author,pFile);
                    WriteString(temp->name,pFile);
                    fwrite(&temp->pages,sizeof(int), 1, pFile);
                    WriteString(temp->thread,pFile);
                    temp = temp->next;
                }       
        }   
        fclose(pFile);
    }
}

编写srtig函数:

void logic::WriteString(string s, FILE *pFile)
{
    if (pFile != NULL)
    {   
        char *str = new char[s.length() + 1];
        strcpy(str, s.c_str());
        int size = strlen(str);
        fwrite(&size, sizeof(int), 1, pFile);
        fwrite(str, size, 1, pFile);
        delete [] str;
    }
}

读取文件:

void logic::ReadInfoFromFile()
{
    pFile = fopen(way.c_str(), "rb");
    if (pFile != NULL)
    {       
        fseek(pFile, 0, SEEK_END);
        if (ftell(pFile) != 0)
        {   
            fseek(pFile, 0, SEEK_SET);
            int check;
            while (check != EOF)
            //while (!feof(pFile))
            {
                temp = new vec;
                temp->author = ReadString(pFile);
                temp->name = ReadString(pFile);
                fread(&temp->pages, sizeof(int), 1, pFile);
                temp->thread = ReadString(pFile);
                temp->next = NULL;
                if (first == NULL)
                {
                    first = temp;
                    first->next = NULL;
                }
                else
                {
                    temp->next = first;
                    first = temp;
                }
                recordsCounter++;

                check = fgetc(pFile);
                fseek(pFile, -1, SEEK_CUR);
            }
        }
    }
    fclose(pFile);
}

读取字符串:

string logic::ReadString(FILE *pFile)
{
    string s;
    if (pFile != NULL)
    {
        int size = 0;
        fread(&size, sizeof(int), 1, pFile);
        char *str = new char[size];
        fread(str, size, 1, pFile);
        str[size] = '\0';
        s = str;
        //delete [] str;   //WHY?????????!!!!!
        return s; 
    }   
    else
        return s = "error";
}

问题出在读取字符串函数中,我在其中释放了内存。 “delete [] str ” 我在这一行遇到程序崩溃。

但如果我不免除内存,效果很好。

请帮帮我!

最佳答案

您分配了 size 个字符但覆盖了 size+1(使用终端“\0”)。内存管理器不喜欢这样。

char *str = new char[size];
fread(str, size, 1, pFile);
str[size] = '\0'

关于c++ - 读取二进制文件时释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26930234/

相关文章:

c++ - 在 C++ 中覆盖文本文件

c++ - Qt5迁移: Cannot open include file: 'qtconcurrentexception.h' : No such file or directory

带有两个参数的 C++ 参数包递归

c - 内联汇编时如何防止GCC警告函数没有返回?

c - TclLib C DLL,避免 Tcl_DuplicateObj,调用时出现共享对象错误

java - Android - 从文件中读取文本并将其添加到 LinkedHashMap

C++ 简单线程池

c++ - Box2D b2Contact 传感器无法检测到物体碰撞

c - 故障,原因不明

java - 用Java读取文件