[quote=引用 6 楼 vipcxj 的回复:] 又是初学者爱犯的毛病,只有POD类型可以安全地写到文件再读回来。string不是POD类型,不能直接写进文件,具体原因是string是个复杂的类,内部可能有指针成员,指向new出来的堆对象,但因为它会在析构函数里自己delete,所以不会有内存泄漏,使用时也完全感觉不到它使用了堆,但一旦你序列化,也就是写到文件里,那个指针也被写到文件里的。如果你再搞一个string对象读取出来,那么同一时间,就会有两个string对象持有同一个指向相同堆内存地址的指针,然后他们肯定都会析构,于是那个指针必定被delete两次,必定发生异常。 既然LZ声称能为这个问题想一下午,并且我也指出了发生问题的原因,我相信LZ可能都用不着一晚上,就能自己解决了
又是初学者爱犯的毛病,只有POD类型可以安全地写到文件再读回来。string不是POD类型,不能直接写进文件,具体原因是string是个复杂的类,内部可能有指针成员,指向new出来的堆对象,但因为它会在析构函数里自己delete,所以不会有内存泄漏,使用时也完全感觉不到它使用了堆,但一旦你序列化,也就是写到文件里,那个指针也被写到文件里的。如果你再搞一个string对象读取出来,那么同一时间,就会有两个string对象持有同一个指向相同堆内存地址的指针,然后他们肯定都会析构,于是那个指针必定被delete两次,必定发生异常。 既然LZ声称能为这个问题想一下午,并且我也指出了发生问题的原因,我相信LZ可能都用不着一晚上,就能自己解决了
//write Item item; int len = item.name.length(); fstream.write((char*)&len, sizeof(int)); fstream.write(item.name.c_str(), len); fstream.write((char*)&item.price, sizeof(item.pricing)); 读的过程与之对应.
//write Item item; int len = item.name.length(); fstream.write((char*)&len, sizeof(int)); fstream.write(item.name.c_str(), len); fstream.write((char*)&item.price, sizeof(item.pricing));
33,311
社区成员
41,784
社区内容
加载中
试试用AI创作助手写篇文章吧