【发布时间】:2011-12-19 23:12:47
【问题描述】:
当你在一个没有虚函数的类中重写一个不是虚函数的成员函数时,VS 编译器会出现“_BLOCK_TYPE_IS_VALID”错误。
例如,
class A{
public:
int a;
public:
void func(){}
~A(){}
};
class B : public A{
public:
virtual void func(){}
~B(){}
};
int main(void){
A* a = new B();
delete a; // error!
return 0;
}
我猜这是因为在 main() 中,a 有 vtable 但编译器错过了它并且无法获得标头的确切大小?
谁能让我对这件事的好奇心破灭?
提前致谢。
【问题讨论】:
-
A 没有 vtable,因为其中没有虚函数。 A 是一个 POD 类。
-
@jmucchiello
A有一个用户定义的析构函数,因此它不符合 POD 的条件。不过,关闭。