gpt4 book ai didi

c++ - _declspec( novtable ) 什么时候不安全?

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:15 29 4
gpt4 key购买 nike

什么情况下_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
}

为什么前两个示例中的代码没有在析构函数上抛出?

最佳答案

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

If you attempt to instantiate a class marked with novtable and then access a class member, you will receive an access violation (AV).

您遇到访问冲突的代码是您在 novtable 类上显式调用“删除”的代码。

关于c++ - _declspec( novtable ) 什么时候不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9952532/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com