0x50E2DF58时未处理的异常 (msvcp120d.dll)
Unhandled exception at 0x50E2DF58 (msvcp120d.dll)
我正在尝试从二进制文件读取结构。程序退出时将引发错误。我中断了它,并且在执行返回 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
实例的内部指针设置为垃圾。 当调用它们的析构函数时,它们会尝试读取垃圾指针,和/或释放垃圾指针。
无论如何,这是一件坏事。
要解决此问题,您需要实现一些机制来实际序列化/反序列化字符串,仅复制对象的原始字节不会削减它。
相关文章:
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 不同的Visual Studio版本中缺少.dll
- MSVCP120d.dll missing
- 在VS中编译C++,而不需要在运行时使用MSVCP120D.dll
- Visual Studio,调试断言失败,MSVCP120D.dll
- 由于msvcp120d.dll,发布版本崩溃
- 为什么我的Qt应用程序在计算机上请求msvcp120d.dll,而不是我的
- 如何在Visual Studio 2015中修复错误MSVCP120D.dll
- 使用VS2015 Express,删除VS2013社区,无法运行"MSVCP120d.dll missing"
- 0x50E2DF58时未处理的异常 (msvcp120d.dll)