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

Unhandled exception at 0x50E2DF58 (msvcp120d.dll)

本文关键字:msvcp120d dll 异常 未处理 0x50E2DF58      更新时间:2023-10-16

我正在尝试从二进制文件读取结构。程序退出时将引发错误。我中断了它,并且在执行返回 0 后出现错误。

当我运行程序时,它实际上会显示结果。直到system("pause")之后它才会崩溃

这是实际错误:结构读取器.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实例的内部指针设置为垃圾。 当调用它们的析构函数时,它们会尝试读取垃圾指针,和/或释放垃圾指针。

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

要解决此问题,您需要实现一些机制来实际序列化/反序列化字符串,仅复制对象的原始字节不会削减它。