c++ - 如何确定 VMT 指针的计数

标签 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 个函数,但考虑到我没有类定义,我如何确定这些指针类有多少?如何动态找出?

谢谢!

最佳答案

只是不要这样做。

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

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

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

我的观点是,您用于获取 VMT 的代码行可能根本不会指向 V 表。它的工作方式依赖于实现,编译器编写者可以自由地按照他们想要的方式进行操作,只要最终产品按照标准正确工作即可。

最后一个问题?为什么?您要解决什么问题需要像这样在大多数程序员远离的地方进行挖掘。

关于c++ - 如何确定 VMT 指针的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49289224/

相关文章:

c++ - 对象构造期间缓冲区太小。觉得跟strcpy_s()有关系

ruby - 我怎样才能 "replace"通过 ruby​​ include 函数包含的模块

c++ - 为什么链接到动态库时静态库中的模板化函数会崩溃?

c++ - 暴力破解不同输入导致程序崩溃的策略是什么?

javascript - JavaScript 函数 commit() 和 send() 之间有什么区别?

php - 当 php 的 mysql_query 返回 0 时,它会产生错误。怎么修?

java - 在java中调用类,使用字符串中的类名

c++ - 问题接收UDP数据包

c++ - 解析 C/C++ 源代码 : How are token boundaries/interactions specified in lex/yacc?

c++ - 生成 "Next Number"并添加到 char*