【发布时间】:2018-09-21 09:23:35
【问题描述】:
我在很多地方都得到了这样的代码:
some_function_signature()
{
T a;
T b = f1(a);
T c = f2(b);
T d = f3(c);
...
}
如您所见,在这样的函数中,a 被传递给f1() 以产生b,然后b 被传递给f2() 以产生c,以此类推。这些变量不会在函数调用后使用 (f1,f2,f3...)。它们拥有大内存(例如T 是大图像数据)。 这里的问题是,在这个函数中,累积的内存消耗可能很大,我想减少它。等待T的析构函数释放内存会使some_function_signature()的内存使用峰值非常大。
我可以这样做以在使用后释放内存:
some_function_signature()
{
T a;
T b = f1(a); a.free();
T c = f2(b); b.free();
T d = f3(c); c.free();
...
}
我想知道我是否可以使这个过程自动化并且更优雅。例如,一个范围内存管理过程或使用某种引用计数,但我只是不知道如何在这里最好地应用这些方法。
【问题讨论】:
-
如果你没有为它们显式分配内存,为什么你认为你必须显式释放它们?
-
T d = f3(f2(f1(T{})));? -
@P.W 目的是减少内存消耗,这是否是显式内存释放是另一个话题。而且我知道这看起来不对,这就是我问这个问题的原因。
-
析构函数应该释放所有内存,而不是魔术
free成员函数。 -
只有 malloc 完成的分配必须被释放。在堆栈上分配的变量超出范围并被自动销毁。
标签: c++ c++11 memory-management