gpt4 book ai didi

c++ - 虚拟析构函数如何工作?

转载 作者:可可西里 更新时间:2023-11-01 18:42:03 24 4
gpt4 key购买 nike

几个小时前,我正在摆弄内存泄漏问题,结果证明我真的搞错了一些关于虚拟析构函数的基本知识!让我解释一下我的类(class)设计。

class Base
{
virtual push_elements()
{}
};

class Derived:public Base
{
vector<int> x;
public:
void push_elements(){
for(int i=0;i <5;i++)
x.push_back(i);
}
};

void main()
{
Base* b = new Derived();
b->push_elements();
delete b;
}

边界检查器工具报告派生类 vector 中存在内存泄漏。而且我发现析构函数不是虚拟的,也没有调用派生类的析构函数。当我将析构函数设为虚拟时,它出人意料地得到了修复。即使未调用派生类析构函数, vector 也不会自动释放吗?这是 BoundsChecker 工具的一个怪癖,还是我对虚拟析构函数的理解有误?

最佳答案

当基类没有虚析构函数时,通过基类指针删除派生类对象会导致未定义的行为。

您所观察到的(对象的派生类部分永远不会被销毁,因此它的成员永远不会被释放)可能是许多可能行为中最常见的,也是一个很好的例子,说明为什么确保当您以这种方式使用多态性时,您的析构函数是虚拟的。

关于c++ - 虚拟析构函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2722537/

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