是否有一种方法可以使c++析构函数被急切地调用

Is there a way to get C++ destructors called eagerly?

本文关键字:析构函数 c++ 调用 可以使 方法 一种 是否      更新时间:2023-10-16

我的c++代码中的一些函数具有使用大量堆内存的临时局部对象。所以我希望他们能被销毁,在我处理完他们之后立即释放他们的记忆。但是c++只在变量名超出作用域时调用析构函数。是否有一种方法可以让编译器在变量的活动范围结束时自动调用析构函数或其他清理方法?

当然,我可以手动新建/删除对象,但这很不方便,而且容易出错。同样不能令人满意的是使用额外的大括号来显式地限制作用域。

编辑:从回应来看,这似乎不能用当前的c++特性来完成。

您可以使用内部作用域,但通常表示您可以使用子函数

void foo()
{
    // some stuff
    {
        BigData bigData;
        // some other stuff
    } // bigData is released now.
    // some other stuff
}

不处理交错变量

不能,根据定义,析构函数只能作为对象的析构序列的一部分调用。

然而,没有什么可以阻止你释放和回收你的类拥有的任何资源,而不需要等待析构函数。

例如,如果你的类有一个大的std::list类成员,没有法律禁止你调用clear()来删除它的内容,而不是等待析构函数中自然发生。

或者,如果您的类析构函数是"安全的",并且做了需要做的事情,则只需将其分解为私有类方法,使析构函数只包含私有方法调用,并在您想要释放相同资源时做同样的事情。

如果努力是值得的(至少测量两次!),您可以使用std::optional来使您能够更快地破坏所选的类类型。

控制对象生命周期的一种方法是使用std::optional。这将允许对象提前结束其生命周期,但该过程不是自动的。它需要手动将变量设置为nullopt

要获得你想要的自动行为,你可以为std::optional定义一个类型别名

template <typename T>
using eagerly_destroy = optional<T>;

接下来,您需要创建一个程序来处理您的源代码,以查找使用这个eagery_destroy模板声明的所有变量,并查找这些变量的最后使用情况,并将= nullopt添加到正确的位置。

或者您可以找到一个开源编译器实现,并将其作为实现您所建议的功能的起点。