虚拟函数表何时设置为0
When is the virtual function table set to 0
我正在分析我们的应用程序中发生的访问冲突,因为它试图在虚拟函数表指向0的对象上调用虚拟函数。所以我想知道,在对象的生命周期中,虚拟函数表指针在什么时候没有设置或显式设置为零?
(我们使用Visual C++10作为编译器。)
当对象处于有效状态时,vtable指针永远不会为0。在构造和销毁过程中,当对象具有抽象基类的动态类型时,vtable将指向抽象基类vtable,该抽象基类将包括纯虚拟函数,但vtable指针本身仍将为非零。
vtable指针唯一可以为零的时间是在构造之前或销毁之后。
如果vtable指针真的为零,那么您可能使用了VC++扩展,例如:
class __declspec(novtable) Base {
public:
Base();
virtual void proc();
};
这里__declspec(novtable)
告诉编译器该类不需要vtable,因为在派生类安装了自己的vtable之前,不会对其调用虚拟函数。如果在此之前调用Base::proc(),则可能会出现错误。
更可能的是,vtable本身是非零的,但函数在其中的槽是零,因为函数是纯虚拟的:
class Base {
public:
virtual void proc() = 0;
};
然后有人用类似的代码称之为
void Derived::proc() {
Base::proc();
// Derived-specific stuff here.
};
这可能是因为Derived的作者认为他们的覆盖需要调用基本版本,即使基本版本不存在。
不管怎样,找到它的一种方法是停止所有基类的恶作剧,正常定义函数,看看是什么调用它
class Base {
public:
virtual void proc() {
assert( typeof(*this) != typeof(Base) ); // Break-point here.
}
};
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 何时在引用或唯一指针上使用移动语义
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 何时提供默认参数作为模板参数
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- C++-明确何时以及如何调用析构函数
- Win32 中是否有一条消息或通知来检测用户何时更改区域设置?
- 唯一_ptr何时在此设置器上重置
- 虚拟函数表何时设置为0
- 问题:何时使用继承与设置属性
- 在c++中执行getline函数调用时,何时设置failbit ?