0

我的问题是建立在这个问题上的:正确的方法从具有非虚拟父级的虚拟类继承

我的理解是否正确,在问题中描述的情况下,新分配对象的三和二部分因为没有被破坏而泄漏?

来源:

#include <iostream>

struct One
{
    ~One() {
        std::cout << "~One()\n";
    }
};

struct Two : One
{
    virtual ~Two() {
        std::cout << "~Two()\n";
    }

    virtual void test() = 0;
};

struct Three : Two
{
    virtual ~Three() {
        std::cout << "~Three()\n";
    }

    virtual void test() {
        std::cout << "Three::test()\n";
    }
};

int main()
{
    Two* two = new Three;
    two->test();

    One* one = two;
    delete one;
}
4

1 回答 1

1

对,那是正确的。内存泄漏的定义是您无法删除您创建的内容(因此您负责管理其生命周期)的情况。

正如该问题的答案所表明的那样,delete one调用未定义的行为(在大多数情况下可能会转化为常规的旧内存泄漏,但事情可能与鼻恶魔一样糟糕),因为指定对象的运行时类型与其静态(声明)类型,并且静态类型没有虚拟析构函数。

C++ 标准的适用部分是这个:

§5.3.5/3:在第一种选择(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数动态类型的基类,静态类型应具有虚拟析构函数或行为未定义。

The solution is either to declare all of the destructors virtual, or not to delete the objects through a pointer to One.

于 2012-01-07T12:09:46.670 回答