_declspec( novtable )
在什么情况下会导致访问冲突?
例如,此代码不会:
class __declspec(novtable) Base
{
public:
virtual ~Base() { };
virtual int Foo() const = 0;
virtual int Bar() const { return 2; };
};
class A : public Base
{
public:
int Foo() const { return 1; };
};
int main(int argc, char* argv[])
{
A a;
volatile int a1 = a.Foo();
volatile int a2 = a.Bar();
Base* c = new A();
volatile int c1 = c->Foo();
volatile int c2 = c->Bar();
delete c;
return 0;
}
此代码也没有:
class __declspec(novtable) Base
{
public:
virtual ~Base() { };
};
int main(int argc, char* argv[])
{
Base a;
}
但是,这段代码将:
int main(int argc, char* argv[])
{
Base* a = new Base();
delete a; // access violation
}
为什么前两个例子中的代码不会抛出析构函数?
答案 0 :(得分:3)
http://msdn.microsoft.com/en-us/library/k13k85ky%28v=vs.71%29.aspx
如果您尝试实例化一个标有novtable的类,那么 访问类成员,您将收到访问冲突(AV)。
您获得访问冲突的代码是您在novtable类上明确调用“delete”的代码。