是否有一种方法可以使c++析构函数被急切地调用
Is there a way to get C++ destructors called eagerly?
我的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
添加到正确的位置。
或者您可以找到一个开源编译器实现,并将其作为实现您所建议的功能的起点。
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 调用析构函数以释放动态分配的内存
- 不命名构造函数和析构函数上的类型错误