free() 错误:大小无效
Error in free(): invalid size
#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)
谁能解释一下这个错误,我应该怎么做才能解决这个问题。
问题是因为您将原始 std::string
对象写入文件,然后再次读取它。这会导致 未定义的行为 。
这不起作用,因为 std::string
基本上(和简化)只是一个指向实际字符串数据的指针。当你写字符串对象时,你写的是指针,当你从文件中读回对象时,你读的是指针。问题是现在您有 two 字符串对象都指向相同的数据。当第一个对象超出范围并被破坏时,它将释放字符串数据,使另一个对象具有指向不再由您的进程拥有的数据的无效指针。当第二个对象被破坏时,它将尝试释放已经释放的数据。
而且只有当您在单个进程中保存和加载对象时才会出现这种情况。如果您试图在不同的进程中加载对象(即使是同一个程序),情况会更糟,而且对于现代虚拟内存系统,没有两个进程具有相同的内存映射。
要将数据保存到文件,您应该研究 serialization。
std::string 大小是可变的,试试下面的代码:
```
char name[256];
char reg[256];
void getdata()
{
std::cin.getline(name, sizeof(name));
std::cin.getline(reg, sizeof(reg));
}
```
#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)
谁能解释一下这个错误,我应该怎么做才能解决这个问题。
问题是因为您将原始 std::string
对象写入文件,然后再次读取它。这会导致 未定义的行为 。
这不起作用,因为 std::string
基本上(和简化)只是一个指向实际字符串数据的指针。当你写字符串对象时,你写的是指针,当你从文件中读回对象时,你读的是指针。问题是现在您有 two 字符串对象都指向相同的数据。当第一个对象超出范围并被破坏时,它将释放字符串数据,使另一个对象具有指向不再由您的进程拥有的数据的无效指针。当第二个对象被破坏时,它将尝试释放已经释放的数据。
而且只有当您在单个进程中保存和加载对象时才会出现这种情况。如果您试图在不同的进程中加载对象(即使是同一个程序),情况会更糟,而且对于现代虚拟内存系统,没有两个进程具有相同的内存映射。
要将数据保存到文件,您应该研究 serialization。
std::string 大小是可变的,试试下面的代码:
```
char name[256];
char reg[256];
void getdata()
{
std::cin.getline(name, sizeof(name));
std::cin.getline(reg, sizeof(reg));
}
```