二进制文件读取错误

时间:2016-05-03 06:00:16

标签: c++ binary

第一次运行没有问题,但是当我评论部分代码时,程序终止:

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

问题是您正在尝试读取您可以真正保存到文件或从文件加载的对象。

让我们std::string成员namestd::string个对象基本上只是一个指针到一个动态分配的字符数组(即一个C风格的以零结尾的字符串),加上包含的字符串的长度。问题有两个:首先是当试图保存name对象时,它不会保存字符串,而是指针;第二个问题是指向动态分配数据的指针在每个进程中都是唯一的。

加载对象时会发生的是读取和设置指针,但只有指针。此指针在写入对象的进程中有效,但在当前进程中没有,它不指向进程分配的任何有效内存。使用此指针(在使用字符串对象时完成)将导致未定义的行为,并且UB是崩溃的最常见原因之一。

您需要做的是serialize字符串。如果你想自己编写代码而不是为它使用库(你可以使用很多很好的序列化库)那么你需要将字符串长度写为固定大小的整数,然后编写实际的字符串数据。当您反序列化时,首先必须知道要读取的下一条数据是字符串,然后读取长度,然后是字符串数据,然后从中构造字符串对象。