C++虚函数系列之一:统计class中虚函数的个数
来源:互联网 发布:医院网络调研报告 编辑:程序博客网 时间:2024/05/01 00:36
Author:Jeff 2005-12-2
关键字:C++ 虚函数 栈 存储
环境:Window XP Professional + SP2, VC6.0
无论在栈中还是在堆中申请内存空间,项目组都会要求用memset()将申请到的空间清0。对于简单数据类型数组和结构简单的struct,class,memset()很好用。但是对于某些struct或者class,memset()之后程序会莫名其妙down掉,排起错误来很费力。最后发现用memset()清0的struct或者class,要么里面有虚函数,要么包含的成员对象有虚函数;memset()将空间清0,间接地将指向virtual table的指针清空。如果程序不down掉,那才奇怪呢!
下面看看class在栈中的存储情况。
class C001
{
public:
C001() : ch(32), pos(1) { };
virtual ~C001() { };
private:
virtual void Display(void) {
printf("display C002");
}
public:
virtual void Outp(int n) {
printf("Number = %d/n" , n);
}
private:
int pos;
char ch;
};
int main(void)
{
int d = 0x1234;
C001 c1;
return 0;
}
(代码写的不好看,将就)
编译,Debug,看看变量在内存的存储情况。class内部成员变量按定义的先后顺序由低地址向高地址方向存储(与栈的增长方向相反)。而函数内部变量存储方向与class的相反,与栈的增长方向相同。
int *p = (int *)&c1;
printf("*(p + 1) = %d/n", *(p + 1)); // value of pos
printf("*(p + 2) = %d/n", (*(p + 2) & 0xff)); // value of ch
printf("*(p + 3) = 0x%08x/n", *(p + 3)); // value of d
在class的第一个变量的前面存放不是CCCCCCCC(Debug版本),而是某个具体的值。这个值就是今后研究的重点,指向virtual table指针。class在栈中的情况大致如下:
(我的机器上virtual table位于常量存储区,有点怪怪的,不知道为什么?)
virtual table的第一个元素是C001::`scalar deleting destructor'(不知道如何称呼它)。在C001::`scalar deleting destructor'函数体内先调用C001::~C001(),再调用operator delete释放申请的内存空间。 在virtual table的最后是00 00 00 00,表示virtual table的结束。有了这些,就可以计算class到底有多少个虚函数(包括继承来的)。
int *p = (int *)&c1;
int *q;
for (int i = 0; ; i++) {
q = (int *)*((int *)(*p) + i);
if (NULL == q) {
printf("virtual function number = %d/n", i);
break;
}
}
对class C001来说,virtual function number = 3。
- C++虚函数系列之一:统计class中虚函数的个数
- C中参数个数可变的函数
- php统计数组中各项的个数用函数array_count_values
- PHP统计中英文字符个数的函数
- 关于sumproduct函数的无法统计个数
- 构造函数统计创建的对象个数
- fscanf函数统计文件的单词个数
- linux 常用C函数系列之一
- C++虚函数系列之二:绕过class的访问机制访问虚函数
- C语言中实现参数个数可变的函数
- 关于C/C++函数声明中参数个数的疑问
- C语言中实现参数个数不确定的函数
- C语言中实现参数个数不确定的函数
- C语言中不定参数个数的函数
- C语言中实现参数个数不确定的函数
- 【C++】统计string里面出现的字符的个数(使用count函数)
- 调用函数求二维数组中元素和,并统计数组中奇数的个数
- C语言中常用的函数之一,伪随机数参数
- OGRE分析之文件系统 (1)
- 剖析Windows用1G内存还慢的原因
- 学习.net笔记(1)
- 菜鸟学技术写总结,CS模式交易系统...
- windows 中的几个杀手级的命令
- C++虚函数系列之一:统计class中虚函数的个数
- 众名姬春风吊柳七
- 十一月的Kemin,不是萧邦 2005
- 龌龊的竞标
- 四川数字游戏动画基地正式启动
- Xbox 360已被黑客破解 可支持MP3文件存储
- 我用google偷窥__摄像头地址集
- 将自己的手写体制成你自己的字体
- 威望迪环球对手机游戏开发寄予厚望