问题标签 [vtable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3408 浏览

c++ - 编译器是否为所有类创建了一个 Vtable?

网上有很多关于 VTable 的资源。他们通常对它们有相同的声明:

"每当一个类本身包含虚函数或覆盖父类的虚函数时,编译器都会为该类构建一个 vtable。这意味着并非所有类都有编译器为它们创建的 vtable。vtable 包含指向那个类中的虚函数。每个类只能有一个vtable,同一个类的所有对象都将共享同一个vtable。

那么,为什么这意味着并非所有类都有编译器为它们创建的 vtable 呢?是因为 somc 类没有虚函数吗?

0 投票
3 回答
8881 浏览

c++ - g++ -fdump-class-hierarchy 的输出中的第一个 (int (*)(...))0 vtable 条目是什么?

对于此代码:

编译后,我得到的 vtableg++ -fdump-class-hierarchy是:

我不明白(int ( )(...))0* 之类的条目对应于什么。当然它的意思是,它是一个返回一个 int 并接受无限数量的参数的函数,我什么都不懂。这个函数指针对应于哪个函数?你怎么知道的?我的是64位机器。

第二个函数指针在末尾有一个关联的地址??这对应于谁?

编辑

我使用的编译器是 g++:

0 投票
4 回答
15113 浏览

c++ - 什么会导致 VTable 指针在 Win32 调试版本中为 0xdddddddd?

我正在调试一个缺陷,并将其缩小到对象的 vtable 指针0xdddddddd此答案表明 Win32 调试版本通常会将死内存或已删除的内存设置为此特殊值。

请注意,指针本身看起来是有效的,它只是vtable 指针0xdddddddd

这是一段代码:

如果我在访问冲突的行中断并观察pMyObject,我可以看到它pMyObject本身有一个有效的地址(0x08ede388)但__vfptr成员是无效的(0xdddddddd)。

一些注意事项:

  • 这是一个单线程应用程序,所以这很可能不是竞争条件或互斥问题。
  • 似乎没有任何明显的问题,例如在访问之前删除调用堆栈中的对象。
  • 这个问题似乎只能在 Windows 2008 服务器上重现,但不能在 Windows 7 上重现。

关于如何进一步调试的任何建议?

0 投票
2 回答
1683 浏览

c++ - 将基类构造为抛出异常对象

直觉告诉我抛出的类型越简单越好。抛出一个 int 比抛出一个指针更好,抛出一个结构比抛出一个类更好。在这种情况下,尽管有必要抛出一个带有动态分配成员的几乎完整的类。在堆中分配内存很方便,因为缓冲区可能会变得很长并且复制很昂贵;它不需要方法,因为它充当其他对象的控制/参数结构,但是在堆中构建它以抛出指向结构的指针和使用析构函数来清理内存都很方便。越简单越好,那么析构函数应该是虚拟的吗?省略 vtable或vtables完全不影响异常传递会更好吗?

从此结构派生类作为基类的优点是添加更多数据,而不是多态方法。指针可能会在异常点前几层被捕获并在模块之间传递,因此对象应尽可能干净,并尽可能降低复合错误的风险。

0 投票
4 回答
322 浏览

c++ - C++ 规范是否允许非虚拟类的实例包含用于 vtable 指针的内存?

C++ 规范是否允许非虚拟类的实例包含用于 vtable 指针的内存?我问这个是因为一位同事说他曾经使用过 C++ 编译器,其中发生了以下情况:

然后他把代码改成这样,去掉了多余的字:

这些类型都不是虚拟的,也不是从任何虚拟的东西派生的。所以理论是,也许这个特定的编译器为类实例的 vptr 分配了内存,但没有为结构实例分配内存。所以我只是想确定规范是否排除了这种编译器行为。

谢谢!

0 投票
4 回答
2523 浏览

c# - 在 C# 中使用反射覆盖虚拟方法表

有没有办法更改 C# 中的虚拟方法表?像改变虚拟方法指向的地方?

0 投票
5 回答
37574 浏览

qt - Qt:信号和槽错误:未定义的引用`vtable for

以下链接中的示例:http: //developer.kde.org/documentation/books/kde-2.0-development/ch03lev1sec3.html

结果是:

vtable 用于虚拟功能,AFAIK,这里出错的原因是什么?

0 投票
4 回答
9581 浏览

c++ - C++中虚表的结构是什么?


例如,我有两个“接口”和类类型:

vtab 实际上具有什么结构,例如 type Tester?以及 表达式中的dynamic_cast操作员行为(我的意思是dynamic_cast操作员如何扫描 vtab 以进行有效的引用类型转换):

提前致谢!

0 投票
3 回答
8709 浏览

com - 在 IDA Pro 中是否可以对 .data 段中定义的 vtable 进行结构字段偏移?

这是我想要实现的目标。我确定了一个类,我将其定义为存储类数据的结构。该类的方法之一使用类字段,就好像它是指向 vtable 的指针。

如您所见,它从 vtable 调用第三个函数。在运行时,我发现 vtable_40194AE0 指向 .data 部分中的数组,如下所示

有没有办法以某种方式告诉 IDA vtable_40194AE0 总是指向 0x40194AE0 处的 vtable 所以给定的伪代码调用看起来像

?

我试图将结构的 vtable_40194AE0 设置为“用户定义的偏移量”,但它没有帮助:(

非常感谢 !

0 投票
3 回答
3820 浏览

c++ - 如何确定 C++ 类是否有 vtable?

今天早些时候,我的一个朋友向我发送了以下挑战:

给定以下代码,提出OBJECT_HAS_VTABLE程序 print的实现AnObject has a vtable = 0, AnObjectWithVTable has a vtable = 1

我想出了以下我认为足够体面的解决方案:

这个问题有更好的解决方案吗?

编辑

该解决方案不必在所有编译器中都是通用的。它可以在 gcc、g++、MSVC 上运行...只需指定您的解决方案对哪个编译器有效即可。我的适用于 MSVC 2010。