从二进制文件中读取元素时引发异常(引发异常:读取访问冲突. _Pnext 0xB414D4)



首先,我做了一个简单的类:

class test
{
public:
test(string name="",int age=0);
void getData();
void show();
private:
string name;
int age;
};
test::test(string name,int age)
{
this->age = age;
this->name = name;
}
void test::getData()
{
cin >> age;
cin >> name;
}
void test::show()
{
cout << "AGE:" << age<<"n";
cout << "NAME:" << name << "n";
}

在我的主函数中调用 getData(( 方法从用户输入值,然后将它们保存在二进制文件中。 现在,当我尝试读取文件时,它确实将值存储在类的新对象中,但我收到异常(引发异常:读取访问冲突。 _Pnext 0xB414D4。 我的主要功能看起来像这样:

int main()
{
ifstream os("new.dat", ios::binary);
test b;
os.read(reinterpret_cast<char*>(&b), sizeof(b));
b.show();
return 0;
}

这里的问题是你试图读取test对象,就好像它是一个简单的平面对象一样。由于很多很多原因,这几乎总是一个坏主意。

在您的情况下,std::string 成员根本不是一个简单的对象!在后台,std:: 字符串通常至少有 1 个指针成员到它分配字符串的位置。

如果只是将 stest对象保存在一个会话中,并在另一个会话中恢复二进制表示形式,则可以将这些指针设置为现在完全垃圾的地址。

以以后可恢复的方式保存数据结构的过程称为序列化,这是一个复杂的主题。

这里的问题是您正在尝试读取test对象,就好像它是一个简单的平面对象一样。由于很多很多原因,这几乎总是一个坏主意。

在您的情况下,std::string 成员根本不是一个简单的对象!在后台,std:: 字符串通常至少有 1 个指针成员到它分配字符串的位置。

如果只是将test对象保存在一个会话中,然后在另一个会话中还原二进制表示形式,则可以将这些指针设置为现在完全垃圾的地址。

最新更新