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();将发生段错误,两次程序虚函数表地址不一样
阅读全文
0 0
- C++二进制读写类对象注意指针问题
- c/c++二进制读写
- c语言指针使用的注意问题
- C语言 多维指针注意问题
- C语言注意问题: 空指针
- C++/C 文件二进制读写
- C++/C 文件二进制读写
- C语言读写二进制流
- C类对象的二进制格式
- C语言 指针要注意的一些细节问题
- C/C++中的指针的应用及注意问题
- C/C++中的指针的应用及注意问题
- 使用指针注意问题
- fstream读写文件注意问题
- C/C++ 二进制 追加读写文件
- C/C++二进制读写===
- C/C++二进制读写png文件
- python与C的数据二进制读写
- C语言中的字符串
- AJAX批量删除传递数组乱码问题
- Android面试题【高级工程师版】
- sublime text2如何连接FTP/SFTP——图文详细教程
- ArrayList去除集合中自定义对象元素的重复值
- C++二进制读写类对象注意指针问题
- 奇怪的短信
- HyperNet: Towards Accurate Region Proposal Generation and Joint Object Detection
- d3区域生成器
- php 简单消息推送(含源码)
- LinkedList类概述
- spring redisTemplate 持久化到redis中数据更改为String类型
- iOS汇编教程:ARM(1)和ARM(2)
- Mac 误删(抹掉)系统后,恢复重装