0x50E2DF58处于未处理的异常(msvcp120d.dll)

时间:2014-04-07 01:32:42

标签: c++ io

我试图从二进制文件读取结构。程序退出时抛出错误。我打破了它,并在执行返回0后出现错误。

当我运行程序时,它实际显示结果。它在system("pause")

之后才会崩溃

这是实际错误:struct 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;
}

1 个答案:

答案 0 :(得分:3)

从函数返回时,将执行users数组的每个元素的析构函数。

users数组包含5个user个对象,每个对象都包含std::string

std::string个对象抽象堆分配的内存,它们用作缓冲区来包含它们包含的字符串的每个字符。

当您对users数组的每个元素执行二进制写操作时,您将std::string实例的内部指针设置为垃圾。当他们的析构函数被调用时,他们会尝试读取垃圾指针,和/或释放垃圾指针。

无论如何,这是一件坏事。

要解决这个问题,你需要实现一些实际序列化/反序列化字符串的机制,只需复制对象的原始字节就不会削减它。