gpt4 book ai didi

c++ - 基础和派生虚拟析构函数的影响

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:49 24 4
gpt4 key购买 nike

我对多个虚拟析构函数有了一些重新考虑,尤其是。读后阅读http://blogs.msdn.com/b/oldnewthing/archive/2004/05/07/127826.aspx .

假设我有

class Base
{
public:
Base();
virtual ~Base();

private:
Logger* _logger;
};

//and

class Derived : public Base{
public:
Derived();
virtual ~Derived();

private:
Logger* _logger;
};

在 cpp 文件中,在每个析构函数中我删除了相应的 _logger 指针

Base::~Base(){  //base.cpp
delete _logger;
}
Derived::~Derived(){ //derived.cpp
delete _logger;
}

这会像我预期的那样工作,没有内存泄漏吗?

最佳答案

首先,如果您将基类析构函数设置为virtual,那么如果您将它们声明为virtual,所有派生类将自动获得一个virtual 析构函数> 或不。这通常适用于匹配签名:如果基类有一个 virtual 函数,其签名与派生类中的函数相同,则派生类中的函数是 override 并且是 virtual(尽管在 C++ 2011 中,您可以使用 final 关键字防止进一步覆盖,在这种情况下,另一个覆盖会产生错误)。

也就是说,析构函数是特殊的:当您将析构函数设为 virtual 时,即使存在另一个覆盖析构函数,它仍会被调用!析构函数是 virtual 的唯一影响是如果您使用指向基类的指针 delete 一个对象,而该对象实际上恰好是派生类型时会发生什么:如果析构函数不是 virtual 如果析构函数是 virtual,您会得到未定义的行为,而正确的事情会发生。例如:

class not_a_base {};
class bad_idea: public not_a_base {};

class a_base { public: virtual ~a_base() {} };
class ok: public a_base {};

int main() {
a_base* ab = new ok;
delete ab; // <---- all is good here!

not_a_base* nab = new bad_idea;
delete nab; // <---- results in undefined behavior
}

默认情况下析构函数不是虚拟的原因很简单,这意味着对象大小总是增加一个单词大小,这通常是 Not Acceptable 。

关于c++ - 基础和派生虚拟析构函数的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13426378/

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