Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法得到C++;破坏者急切地打电话来? < >我的C++代码中的一些函数有临时的本地对象,这些对象使用大量堆内存。所以我希望它们被破坏,在我处理完它们后尽快释放它们的内存。但是C++在变量名超出范围时只调用析构函数。有没有办法让编译器在变量的活动范围结束时自动调用析构函数或其他清理方法_C++_Optimization_Scope_Destructor - Fatal编程技术网

有没有办法得到C++;破坏者急切地打电话来? < >我的C++代码中的一些函数有临时的本地对象,这些对象使用大量堆内存。所以我希望它们被破坏,在我处理完它们后尽快释放它们的内存。但是C++在变量名超出范围时只调用析构函数。有没有办法让编译器在变量的活动范围结束时自动调用析构函数或其他清理方法

有没有办法得到C++;破坏者急切地打电话来? < >我的C++代码中的一些函数有临时的本地对象,这些对象使用大量堆内存。所以我希望它们被破坏,在我处理完它们后尽快释放它们的内存。但是C++在变量名超出范围时只调用析构函数。有没有办法让编译器在变量的活动范围结束时自动调用析构函数或其他清理方法,c++,optimization,scope,destructor,C++,Optimization,Scope,Destructor,当然,我可以手动新建/删除对象,但这既不方便又容易出现错误。同样令人不满意的是使用额外的大括号来明确限制范围 编辑:从响应来看,这似乎不能用当前的C++特性来完成。我建议在下一个标准中使用它。您可以使用内部作用域,但通常情况下,您可能会使用子函数 void foo() { // some stuff { BigData bigData; // some other stuff } // bigData is released now.

当然,我可以手动新建/删除对象,但这既不方便又容易出现错误。同样令人不满意的是使用额外的大括号来明确限制范围


编辑:从响应来看,这似乎不能用当前的C++特性来完成。我建议在下一个标准中使用它。

您可以使用内部作用域,但通常情况下,您可能会使用子函数

void foo()
{

    // some stuff
    {
        BigData bigData;

        // some other stuff
    } // bigData is released now.

    // some other stuff
}

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

但是,没有什么可以阻止您在不等待析构函数的情况下释放和释放类所拥有的任何资源

例如,如果您的类有一个大的
std::list
类成员,则没有法律禁止您调用
clear()
,以删除其内容,而不必等待析构函数中自然发生这种情况


或者,如果您的类析构函数是“安全的”,并且执行了需要执行的操作,只需将其分解到私有类方法中,让析构函数只包含私有方法调用,并在您希望释放相同资源时执行相同操作。

如果付出的努力确实值得(至少测量两次!),您可以使用使您能够更快地销毁所选的类类型


但要确保使用范围界定无法实现目标。

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

要获得您想要的自动行为,您可以为
std::optional

template <typename T>
using eagerly_destroy = optional<T>;
模板
急切地使用销毁=可选;
接下来,您需要创建一个程序来处理源代码,以查找使用此模板声明的所有变量,并找到这些变量的最后一次使用,并将
=nullopt
添加到正确的位置


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

听起来您的函数太长了。“同样令人不满意的是使用额外的大括号来明确限制范围”。我也不明白使用新/删除和使用额外大括号的最后一部分。这不是备选方案,因为要么在堆上分配对象,然后必须使用new/delete,添加大括号根本没有帮助。或者它在堆栈上,然后是另一种方式…@fgrdn RAII不会有帮助,而“全局管理器,它将清理长时间不使用的对象”听起来总的来说是一个非常糟糕的主意。析构函数已经尽可能地“渴望”了。听起来你只是在写糟糕的代码。为什么不把它发布在代码审查上呢?“同样令人不满意的是使用额外的大括号来明确限制范围。”OP不需要大括号(但他们可能不得不处理它们:-)@AndyG:更令人不满意的是OP无缘无故地编制的毫无意义的约束。@KerreSB同意,但“更平等”听起来太有趣了;)@KerrekSB这不是一个毫无意义的约束。编译器出于寄存器分配的目的执行活动性分析,因为程序员显然不希望受到必须通过作用域手动指示变量活动性的约束。那么,为什么通过在本地对象的活动范围结束时自动调用析构函数,将其从寄存器(和堆栈内存)扩展到堆内存是不合理的呢?@NicolasCapens:想想
lock\u guard
变量,它是。。未在定义后明确使用,但应保留到作用域结束。它如何在上次使用时自动销毁对象?@NicolasCapens:无法在上次使用时自动销毁对象,特别是因为对象的存在可能是重要的(例如,考虑锁定或发信号通知程序状态)。这是最接近可能的事情,允许您更早地创建/销毁,并确保生命周期仍然得到正确管理。