刚开始使用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类中显式创建析构函数?或者它是由其他东西引起的?
答案 0 :(得分:5)
Scheduler
不是一个简单的可复制类,你不能按字母顺序读取或写入这样的文件。
http://en.cppreference.com/w/cpp/types/is_trivially_copyable
一个简单的可复制类是
的类
- 没有非平凡的副本构造函数(这也不需要虚函数或虚拟基础)
- 没有非平凡的移动构造函数
- 没有非平凡的副本分配运算符
- 没有非平凡的移动分配操作员
- 有一个简单的析构函数
醇>
您要么必须删除虚拟析构函数(如果您想以多态方式使用Staff
,它会带来一系列问题),使用序列化库读取和写入文件,或者编写自己的序列化函数,规范方式类似于std::ostream& operator<<(std::ostream&, Staff const&);