我的C ++代码中的一些函数具有使用大量堆内存的临时本地对象。因此,我希望它们在被我们完成后立即被破坏并释放他们的记忆。但是当变量名超出范围时,C ++只调用析构函数。有没有办法让编译器在变量的活跃范围的末尾自动调用析构函数或另一个清理方法?
当然我可以手动新建/删除对象,但这很不方便且容易出错。同样不能令人满意的是使用额外的大括号来明确限制范围。
编辑:从响应来看,目前的C ++功能似乎无法做到这一点。我会建议它用于下一个标准。
答案 0 :(得分:5)
您可以使用内部范围,但通常表示您可以使用子功能
void foo()
{
// some stuff
{
BigData bigData;
// some other stuff
} // bigData is released now.
// some other stuff
}
它不会处理交错变量。
答案 1 :(得分:1)
不,根据定义,析构函数仅作为对象销毁序列的一部分被调用。
但是,没有什么可以阻止你释放和释放你的类所拥有的任何资源而无需等待析构函数。
例如,如果您的班级有一个庞大的std::list
班级成员,则没有法律禁止您调用clear()
,删除其内容,而不会等待自然发生在析构函数中。
或者,如果你的类析构函数是"安全",并做了需要做的事情,只需将其分解为私有类方法,让析构函数除了私有方法调用之外什么都不包含,每当你想释放相同的资源时都要这样做。
答案 2 :(得分:1)
如果努力真的值得(至少测量两次!),你可以使用std::optional
让你更快地破坏选定的类型。
确保使用范围确定无法实现目标。
答案 3 :(得分:0)
控制对象生命周期的一种方法是使用std::optional
。这将允许对象提前结束其生命周期,但该过程不是自动的。需要手动将变量设置为nullopt
要获得自动行为,您可以为std::optional
template <typename T>
using eagerly_destroy = optional<T>;
接下来,您需要创建一个程序来处理源代码,以查找使用此eagery_destroy模板声明的所有变量,并查找这些变量的最后用法并将= nullopt
添加到正确的位置。
或者您可以找到一个开源编译器实现,并将其作为实现您建议的功能的起点。