C++虚拟化的例子

pet*_*min 1 c++ virtual-destructor

我试图通过以下示例来理解C++中的破坏行为:https: //github.com/peterdemin/virtual-destruction-5-cents

该列表是否满足所有可能的流程?应该添加什么?如何将给定的例子转换成短期的?

/sf/answers/32285711/提出"始终使基类"的析构函数是虚拟的,当它们被多态操作时.它不包括场景4.

Scott Meyers的Effective C++中的第7项规定:

  • 如果一个类有任何虚函数,它应该有一个虚析构函数;
  • 未设计为基类或未设计为以多态方式使用的类不应声明虚拟析构函数.

这是轻松的(应该不应该)和面对场景2.

UPDATE

我将6502提供的C++标准重写为伪代码:

if static type of object is different from its dynamic type:
    if the static type is a base class of the dynamic type:
        if the static type has a virtual destructor:
            We're fine - dynamic type's destructor will be called
        else:
            behavior is undefined [1]
    else:
        behavior is undefined [2]
Run Code Online (Sandbox Code Playgroud)

[1]代码将在没有警告的情况下编译,并且可能会正常工作,但它不能保证并且可能在运行时导致纠缠错误.

[2]那很尴尬:

class A {};
class B {};
B *a = (B*)(new A());
delete a;
Run Code Online (Sandbox Code Playgroud)

650*_*502 7

使用基指针销毁派生对象并且析构函数不是虚拟的时,最终会出现"未定义的行为"情况.

N3690,5.3.5 [expr.delete] - 3

在第一个备选(删除对象)中,如果要删除的对象的静态类型与其动态类型不同,则静态类型应为要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义

解释说明github存储库是完全错误的("派生的析构函数未被调用,但没有发生内存泄漏").你不能指望这一点.

我没有阅读其余部分,因为这会浪费时间.UB是UB ...试图描述undefined是无稽之谈.