以下代码是否以任何方式违反C ++ 11标准?我在VC ++ 2013中收到失败的断言。
class P {};
class C : public P
{
public:
virtual void a() {}
};
int main()
{
P* p = new C();
delete p;
}
失败的断言是:
File: f:\dd\vctools\crt\crtw32\misc\dbgdel.cpp
Line: 52
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
是的,
delete p;
由于指针的动态类型不同于静态已知的类型,并且静态对象没有虚拟析构函数,因此它具有未定义的行为。
C ++ 11§5.3.5/ 3:
“在第一种选择(删除对象)中,如果要删除的对象的静态类型与它的动态类型不同,则静态类型应为要删除的对象的动态类型的基类,而静态类型应为具有虚拟析构函数或行为未定义
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句