析构函数是否可以在 const 对象上调用非 const 函数

Can a destructor call a non-const function on a const object?

本文关键字:const 调用 函数 对象 析构函数 是否      更新时间:2023-10-16

我搜索了这个问题的答案,但找不到。请考虑以下代码:

struct Foo
{
    int *bar;
    Foo(int barValue) : bar(new int(barValue)) {}
    ~Foo() { do_this(); }
    void do_this() { delete bar; bar = nullptr; }
};
int main()
{
    const Foo foo(7);
}

do_this()不能在const对象上调用,所以我不能做类似foo.do_this()的事情。在某些情况下,在析构函数之外调用do_this()也是有意义的,这就是为什么我不想简单地将代码包含在析构函数定义中的原因。因为do_this()修改了成员变量,所以我不能将其声明为 const .

我的问题是:当const对象被销毁时,析构函数是否能够调用do_this()

尝试了它并且没有收到任何错误,但我想确保一旦我的程序终止,我就不会导致内存泄漏。

是的,您当然可以安全地从析构函数调用非常量函数。标准明确允许这样做:

15.4/2 析构函数用于销毁其类类型的对象。地址 不得采取析构函数。可以为 常量、挥发性或常量挥发性物体。常量和易失性语义 ([dcl.type.cv]( 不适用于正在销毁的物体。他们 当派生最多的对象的析构函数停止生效 开始。

相关文章: