从文件读取时C ++访问冲突

时间:2014-10-28 10:05:41

标签: c++ file binary destructor

刚开始使用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中的虚拟析构函数。

是不是因为我没有在Scheduler类中显式创建析构函数?或者它是由其他东西引起的?

1 个答案:

答案 0 :(得分:5)

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

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

  

一个简单的可复制类是

的类      
      
  1. 没有非平凡的副本构造函数(这也不需要虚函数或虚拟基础
  2.   
  3. 没有非平凡的移动构造函数
  4.   
  5. 没有非平凡的副本分配运算符
  6.   
  7. 没有非平凡的移动分配操作员
  8.   
  9. 有一个简单的析构函数
  10.   

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