gpt4 book ai didi

c++ - 从具有非虚拟父类的虚拟类继承的正确方法(续)

转载 作者:行者123 更新时间:2023-11-28 08:12:07 26 4
gpt4 key购买 nike

我的问题是基于这个问题:Correct way to inherit from a virtual class with non-virtual parent .

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

来源:

#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;
}

最佳答案

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

作为answers对于那个问题,delete one 会调用未定义的行为(在大多数情况下,这可能会转化为常规的旧内存泄漏,但事情可能会像 nasal demons 一样糟糕),因为指定的运行时类型对象与其静态(声明的)类型不匹配,并且静态类型没有虚拟析构函数。

C++ 标准中适用的部分是:

§5.3.5/3: In the first alternative (delete object), if the static type of the operand is different from its dynamic type, the static type shall be a base class of the operand’s dynamic type and the static type shall have a virtual destructor or the behavior is undefined.

解决方案要么将所有析构函数声明为虚拟,要么不通过指向One 的指针删除对象。

关于c++ - 从具有非虚拟父类的虚拟类继承的正确方法(续),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8769467/

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