free()出错:大小无效

时间:2018-03-22 06:46:53

标签: c++ file-handling

#include <bits/stdc++.h>

using namespace std;

class student
{
 string name;
 string reg;
public:
 void getdata()
 {
  getline(cin,name);
  getline(cin,reg);
 }
 void printdata()
 {
  cout<<name<<"\t"<<reg<<endl;
 }
};

int main()
{
 ifstream fin;
 ofstream fout;
 student obj;
 fout.open("google.txt",ios::out|ios::binary);
 obj.getdata();
 fout.write((char*)&obj,sizeof(obj));
 fout.close();
 student obj2;
 fin.open("google.txt",ios::in|ios::binary);
 fin.read((char*)&obj2,sizeof(obj2));
 obj2.printdata();
 fin.close();
 return 0;
}

我正在尝试对象的文件处理的基本读写操作。 但是在执行上面的代码之后,我成功地能够写入和读取但是我收到了错误消息*** Error in ./io: free(): invalid size: 0x00007ffea93f64b0 ***Aborted (core dumped)

输入: 火刃 ,17HFi394 输出:
火焰之刃,17HFi394 和错误消息:*** Error in ./io: free(): invalid size: 0x00007ffea93f64b0 ***Aborted (core dumped) 任何人都可以解释这个错误,我该怎么做才能解决这个问题。

2 个答案:

答案 0 :(得分:2)

问题是因为您将原始std::string对象写入文件,然后再次读取它。这会导致未定义的行为

这不起作用,因为std::string基本上(和简化)只是指向实际字符串数据的指针。当您编写字符串对象时,您编写指针,当您从文件中读回对象时,您会读取指针。问题是现在你有两个字符串对象都指向相同的数据。当第一个对象超出范围并被销毁时,它将释放字符串数据,而另一个对象则带有一个无效指针,指向您的进程不再拥有的数据。当第二个对象被破坏时,它将尝试释放已经免费的数据。

只有在单个进程中保存并加载对象时才会这样。如果你试图在不同的进程中加载​​对象(即使它是同一个程序),情况会更糟,对于现代虚拟内存系统,没有两个进程具有相同的内存映射。

要将数据保存到文件,您应该研究serialization

答案 1 :(得分:0)

std :: string size是可变的,请尝试以下代码:

```

char name[256];
char reg[256];

void getdata()
{
    std::cin.getline(name, sizeof(name));
    std::cin.getline(reg, sizeof(reg));
}

```