c++ 从二进制文件里 无法读出数据 并显示到屏幕上,求大神解答

#include<iostream>#include<fstream>usingnamespacestd;classok{protected:stringname;int... #include<iostream>
#include<fstream>
using namespace std;
class ok
{
protected:
string name;
int i;
public:
ok(string k="00",int w=0):name(k),i(w){}
void out(){cout <<name<<i;}
};
int main()
{
/* ok o("www",1);
ofstream outfile("1.dat",ios::binary);
outfile.write((char *)&o,sizeof(o));
outfile.close();
*/
ok s;
ifstream infile("1.dat",ios::binary);
infile.read((char *)&s,sizeof(s));
infile.close();
s.out();
return 0;
}

注释部分是第一次用来将数据写进文件的,第一次运行写进文件 然后第二次运行前将其注释掉
运行发现程序停止运行了,但我并不知道为什么,求大神详解
展开
 我来答
百度网友1a1215910
2016-05-02 · 超过31用户采纳过TA的回答
知道答主
回答量:70
采纳率:0%
帮助的人:64.7万
展开全部
试一下把生成文件和读取文件的两段代码都开启并运行, 你会发现这个程序不会报错。为什么呢?

string 类并非单纯的char数组,里面有其他C++标准库用来实现string类各种方便功能所需的变量。string类会自己动态分配一块内存用来存储你的信息。这段内存的位置在每次运行程序的时候不同。 你在序列化你的string的时候,他会把string内部记录内存地址变量也序列化。两次运行,如果分配到的动态内存地址不同, 你的ok类在调用destructor的时候就会试图destruct string name, 然而name里面的地址是错误的,所以就会在释放内存的时候出错。
更多追问追答
追问
是说从文件里读出来的 string类型的成员变量里内部的记录地址的变量 所被赋的值是指向第一次o这个对象里面的string变量?
追答
你说得对。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式