我正在尝试从二进制文件读取到结构中。程序退出时抛出该错误。我断点了它,执行返回0后出现错误。
当我运行程序时,它实际上会显示结果。直到system("pause")
这是实际的错误:结构reader.exe中0x50E2DF58(msvcp120d.dll)的未处理异常:0xC0000005:访问冲突读取位置0x007AB1EC。
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
struct user{
string name;
};
int main(){
fstream file("file.dat", ios::in | ios::binary);
user users[5];
for (size_t i = 0; !file.eof(); i++)
{
file.read(reinterpret_cast<char *>(&users[i]), sizeof(user));
}
file.close();
size_t size = (sizeof(users) / sizeof(user));
for (size_t i = 0; i < size; i++)
{
cout << users[i].name << endl;
}
system("pause");
return 0;
}
从函数返回时,将users
执行数组每个元素的析构函数。
该users
数组包含5个user
对象,每个对象包含一个std::string
。
std::string
对象抽象堆分配的内存,它们用作缓冲区来包含所包含字符串的每个字符。
当对users
数组的每个元素执行二进制写操作时,会将std::string
实例的内部指针设置为垃圾。当调用其析构函数时,它们然后尝试读取垃圾指针,和/或释放垃圾指针。
无论如何,这是不好的生意。
要解决此问题,您需要实现一些机制来实际对字符串进行序列化/反序列化,仅复制对象的原始字节不会削减它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句