【发布时间】: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