gpt4 book ai didi

c++ - 0x50E2DF58 处的未处理异常 (msvcp120d.dll)

转载 作者:行者123 更新时间:2023-11-30 02:47:11 27 4
gpt4 key购买 nike

我正在尝试将二进制文件读入结构。程序退出时会抛出错误。我给它断点,在执行 return 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;
}

最佳答案

当您从函数返回时,users 数组的每个元素的析构函数都会被执行。

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

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

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

无论如何,这是一笔糟糕的生意。

要解决此问题,您需要实现某种机制来实际序列化/反序列化字符串,仅复制对象的原始字节并不能解决问题。

关于c++ - 0x50E2DF58 处的未处理异常 (msvcp120d.dll),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22902242/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com