C++二进制读写类对象注意指针问题

来源:互联网 发布:js获取页面所有内容 编辑:程序博客网 时间:2024/06/06 00:58

虚函数表是一块连续的内存,每个内存单元中记录一个JMP指令的地址(函数地址)。虚函数表可以看做函数指针数组。每个包含虚函数的类都有一张虚函数表vtbl,同一类的所有对象共享一张虚函数表,即每个对象都含有虚函数表指针vptr(对象内存的首部)指向这个类的虚函数表。通过对象指针访问虚函数时在虚函数表中查询来访问虚函数

#include<iostream>#include<cstdlib>#include<cstring>#include<ctime>#include <fstream>using namespace std;class A{public:    A() {}    virtual void say();};class B :public A{public:    B() {}    void say();};class C:public B{public:    C() {}    void say();};void A::say(){    cout<<"A say\n";}void B::say(){    cout<<"B say\n";}void C::say(){    cout<<"C say\n";}int main(){    C c;fstream iofile("1.dat",ios::in|ios::out|ios::binary);//用fstream类定义输入输出二进制文件流对象iofileif(!iofile){   cerr<<"open error!"<<endl;   abort( );}//iofile.write((char*)&c,sizeof(C));//c中包含虚函数表指针iofile.read((char*)&c,sizeof(C));//c.say();A *a=&c;a->say();//这里将发生段错误    return 0;}

首先建立一个文件1.dat,然后先将对象c写入文件。
然后注释掉写入代码,从文件读取内存块复制覆盖对象c的内存形成新的对象c,新的对象c的虚函数表指针值等于一次程序的虚函数表指针值。
a->say();将发生段错误,两次程序虚函数表地址不一样

原创粉丝点击