什么时候__declspec(novtable)不安全?

时间:2012-03-31 02:40:08

标签: c++ vtable

_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
}

为什么前两个例子中的代码不会抛出析构函数?

1 个答案:

答案 0 :(得分:3)

  

http://msdn.microsoft.com/en-us/library/k13k85ky%28v=vs.71%29.aspx

     

如果您尝试实例化一个标有novtable的类,那么   访问类成员,您将收到访问冲突(AV)。

您获得访问冲突的代码是您在novtable类上明确调用“delete”的代码。