在类 12.exe 中的 0x7B37FF80 (ucrtbased.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x00B64F88。发生了

Posted

技术标签:

【中文标题】在类 12.exe 中的 0x7B37FF80 (ucrtbased.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x00B64F88。发生了【英文标题】:Exception thrown at 0x7B37FF80 (ucrtbased.dll) in Class 12.exe: 0xC0000005: Access violation reading location 0x00B64F88. occurred 【发布时间】:2020-06-21 08:12:23 【问题描述】:

我对 c++ 还很陌生。我正在使用 Visual Studio IDE。我正在学习如何将对象发送到文件以及如何检索它们。在检索时,我在那个地方得到了一个异常。我不知道该怎么办

#include <iostream>
#include <fstream>

class Entity 

public:
    int ID;
    const char* name;

    Entity(): ID(-1), name("NOT ASSIGNED") 
    Entity(int a, const char* b) : ID(a), name(b) 
;

std::ostream& operator<<(std::ostream& stream, Entity &e) 

    stream << e.ID << " " << e.name << std::endl; //exception is thrown here
    return stream;


void WriteToFile(Entity e)

    std::cout << "Writing to file\n";
    std::ofstream fout("ENTITY.txt", std::ios::app|std::ios::binary);
    fout.write((char*)&e, sizeof(e));
    fout.close();


void ReadFromFile()

    std::ifstream fin("ENTITY.txt", std::ios::binary | std::ios::in);
    while (!fin.eof())
    
        Entity a;
        fin.read((char*)&a, sizeof(a));
        std::cout << a;
    


int main()

    Entity a(1, "A");
    Entity b(15, "C");
    Entity x;

    WriteToFile(a);
    WriteToFile(b);
    WriteToFile(x);
    ReadFromFile();

【问题讨论】:

生成的文件内容是否符合预期?无论如何,作为这里的新用户,请带上tour阅读How to Ask。 【参考方案1】:

我不知道你从哪里学习,但如果它没有告诉你 istream::readostream::write 不能用于诸如 Entity 之类的对象,那就不是很好了。

为了使用readwrite,对象必须是POD 类型,POD 代表plain old data。此外,任何带有指针的东西都不起作用(因为write 将写入指针本身,而不是指针指向的内容,并且当read 再次读取时,指针值不太可能有效)。

您尝试执行的操作称为序列化,它在 C++ 中比在其他一些语言中更复杂。因此,您可能应该查看一个序列化库。比如boost serialization

【讨论】:

以上是关于在类 12.exe 中的 0x7B37FF80 (ucrtbased.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x00B64F88。发生了的主要内容,如果未能解决你的问题,请参考以下文章

无法识别的选择器发送到实例 0x7ff971e1f920

线程 1:“-[Xylophone.ViewController buttonClicked:]:无法识别的选择器发送到实例 0x7ff83a6074e0”

在类中写reponse语句

信号11(SIGSEGV),代码1(SEGV_MAPERR),故障地址0x7f4485ff1820

转:memset

为什么主引导记录的内存地址是0x7C00?