【问题标题】:C++ Access Violation while Reading from File从文件读取时 C++ 访问冲突
【发布时间】:2014-12-23 16:37:21
【问题描述】:

刚刚开始使用 C++。

我在读取二进制文件时遇到访问冲突错误。以下是所涉及的类:

class Staff { //base class
public:
    Staff() {}
    virtual ~Staff{}
}

派生类之一:

class Scheduler : public Staff {
public:
    Scheduler() {}
    //no destructor defined
}

然后在使用这些类的代码中:

ifstream in("Scheduler.dat", ios::in | ios::binary);
Scheduler s;
in.read(reinterpret_cast<char *>(&s), sizeof(Scheduler));

在我点击read语句的那一刻,访问冲突异常触发,VS2013指向Staff类中的虚拟析构函数。

是不是因为我没有在调度器类中显式创建析构函数?还是其他原因造成的?

【问题讨论】:

    标签: c++ file binary destructor


    【解决方案1】:

    Scheduler 不是一个简单可复制的类,您不能按字节读取或写入这样的文件。

    http://en.cppreference.com/w/cpp/types/is_trivially_copyable

    一般可复制的类是这样的类

    1. 没有重要的复制构造函数(这也不需要虚函数或虚基
    2. 没有重要的移动构造函数
    3. 没有重要的复制赋值运算符
    4. 没有重要的移动赋值运算符
    5. 有一个简单的析构函数

    您要么必须删除虚拟析构函数(如果您想多态地使用Staff,它会带来一系列问题),使用序列化库读取和写入文件,或者编写自己的序列化函数,规范的方式类似于std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, Staff const&amp;);

    【讨论】:

    • 我可以将调度程序对象写入文件就好了,它只在读取时发生
    • @user2990428 未定义的行为并不一定意味着您的程序会崩溃。 Scheduler 的 vtable 是在运行时设置的,每次运行程序时都不太可能相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多