如何确定VMT指针的数量

时间:2018-03-14 23:30:33

标签: c++ function class vmt

使用Visual C ++编译器,每个类对象都有VMT(对象中的第一个指针),它是指向类中每个方法的指针数组的指针。使用这样的代码:

TestObject * object = new TestObject();
void** VMT = (void**)object;
int TestCount = 100;

for( int i = 0; i < TestCount; i ++ )
{
     printf("%d function: %p\r\n", (i+1), VMT[i] );
}

此代码列举了类中的前100个函数,但是如何确定这些指针类有多少考虑到我没有类定义?如何动态找到它?

谢谢!

1 个答案:

答案 0 :(得分:3)

请不要这样做。

首先,没有虚拟成员的类没有V表,因此您尝试获取它最多会产生无效指针,最坏的情况是崩溃。

其次,即使你确实得到它,你也只会找到指向虚拟成员函数的指针,普通函数不会放在V表中。

第三,虽然我注意到你正在使用MSVC,但是可移植性不是一个问题,这是非常不可移植的。我记得回到了一个非常有趣的面向对象系统,我用于我在Sega Genesis上发表的一个游戏。这一切都是在大约1995年的68K汇编程序中完成的,包括一个V表。由于有趣的内存限制,所有V-table在距离其类实例数英里远的地方,位于第一个64K内存页的特殊区域。我们有一些粗糙的连接器技巧来挂钩所有东西,并使它全部工作。

我的观点是,要获取VMT的代码行可能根本不会指向V表。其工作依赖于实现,只要最终产品按照标准正确工作,编译器编写者就可以随心所欲地进行操作。

最后一个问题?为什么?你试图解决的问题是需要在大多数程序员远离的地方进行挖掘。