【问题标题】:Can a destructor call a non-const function on a const object?析构函数可以在 const 对象上调用非常量函数吗?
【发布时间】:2018-08-14 14:33:07
【问题描述】:

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

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()

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

【问题讨论】:

  • 您几乎必须能够修改析构函数中的对象以释放资源。无论是直接在析构函数中还是在其他函数中发生都无关紧要。
  • “......一旦我的程序终止就会导致内存泄漏......”没有任何意义。一旦程序终止它分配的所有资源都被内核释放 - 泄漏不再是问题。泄漏在程序运行时发生的问题,因为您可能会耗尽资源。但终止后,担心泄漏是无效的。
  • 但是变异的const对象是UB...
  • @Jarod42:虽然是const,是的。这是一个相当相关的限制。这也是为什么构造函数和析构函数都是special functions

标签: c++ constants language-lawyer destructor


【解决方案1】:

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

15.4/2 析构函数用于销毁其类类型的对象。地址 不应采取析构函数。一个析构函数可以被调用 const、volatile 或 const volatile 对象。 const 和 volatile 语义 ([dcl.type.cv]) 不适用于正在破坏的对象。他们 当最派生对象的析构函数停止生效 开始。

【讨论】:

    猜你喜欢
    • 2019-11-20
    • 1970-01-01
    • 2010-09-29
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多