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

C++ 读取二进制文件时释放内存,c++,c,file,memory,fread,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 (pFi

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

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
chars的同时覆盖size+1(使用终端'\0'),您将关闭一个。内存管理器不喜欢这样

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

为什么要进行所有这些动态分配来编写std::string?只需使用
c_str()
string::size()
。有关字符串的所有信息都在这两个函数中。您的代码有一些问题,主要是因为将C函数与C++代码混合。一个(次要)问题是,它不会返回
int
,而是
std::size\u t
。如果您学会使用,并且使用而不是
char*
,许多问题都会自动消失。我这样做是因为我不知道如何将字符串写入二进制文件,长期以来,我一直受此困扰,决定在读/写
fwrite时使用char*(&s.length(),sizeof(int),1,pFile);fwrite(s.c_str(),1,s.length(),1,pFile)如果
new[]
抛出异常会发生什么情况?@PaulMcKenzie