- 论坛徽章:
- 1
|
一般情况,虚函数表指针是抽象类对象的第一个元素。memset将这个指针清0了,再通过虚函数表访问就失效。
class A 大概布局像这样:
struct A;
struct A_methods { void (* func)(A *This), };
struct A {
A_methods *vtable;
};
void _A_func(A *This) { printf(...); }//等价于: virtual void A::func() { printf(...); }
void _A_clear(A *This) { //等价于 void A::clear() { memset(this, 0, sizeof(*this); }
memset(This, 0, sizeof(*This));
}
static
A_methods vtable_A { &_A_func, };
//构造函数像这样
void _A_construct ( A *This ) {
This->vtable = vtable_A;//有虚函数的,构造时都会隐含执行这个操作
_A_clear(This); //刚设置好虚函数表,然后又清空了;
}
A a;
A *pa = &a;
//pa->func() 是这样执行的:
pa->vtable->func(pa);//为什么崩溃看清了吧?vtable已经在构造函数里清0了,再用这个指针...
// |
|