析构函数可以在const对象上调用非const函数吗?

问题描述 投票:14回答:1

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

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

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

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

c++ const language-lawyer destructor
1个回答
13
投票

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

15.4 / 2析构函数用于销毁其类类型的对象。不得采用析构函数的地址。可以为const,volatile或const volatile对象调用析构函数。 const和volatile语义([dcl.type.cv])不应用于销毁下的对象。当最派生对象的析构函数启动时,它们将停止生效。

© www.soinside.com 2019 - 2024. All rights reserved.