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

迈克·博克兰

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

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当对象被销毁的对象?

我尝试了一下,没有收到任何错误,但是我想确保一旦程序终止,我不会造成内存泄漏。

谢尔盖

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

const函数可以在本地对象上调用非const函数吗?

在const对象上调用非const函数

如何从析构函数调用const成员函数

是否在Exit()上调用基本对象析构函数?

从析构函数调用非成员函数可以吗?

是noop时需要调用非平凡的析构函数吗?

块范围静态的析构函数可以调用几次吗?

为什么不允许将右值引用绑定到非const引用,但是却可以在一个对象上调用非const成员函数

在函数调用期间析构对象

std::map 对象析构函数被调用?

析构函数调用

C++ 可以使析构函数不调用类成员的析构函数和基类的析构函数吗?

在int32_t上调用析构函数合法吗?

如何防止意外地在非const对象上调用变异函数?

如何在动态数组中的某些对象上调用析构函数

什么时候在堆中的对象上调用C ++析构函数?

不要在不完整的对象上调用析构函数(PHP 7.1不兼容的更改)

当T具有非平凡的析构函数时,可以将类型T的对象常量初始化吗?

在新的放置缓冲区上调用析构函数?

在postOrderDeletion上调用析构函数时引发异常

防止为非const对象调用const函数

C ++构造函数/析构函数调用&在动态创建的数据上调用“ new”会删除旧数据吗?

我可以使用函数指针调用虚拟析构函数吗?

返回的结构调用它自己的析构函数,该析构函数销毁分配的对象

从析构函数调用BeginInvoke

在 const 迭代器上调用成员函数

不调用对象的析构函数是未定义的行为吗?

对象向量的析构函数

是否可以在放置新分配的对象上不调用析构函数?