【问题标题】:automatic memory release after use使用后自动释放内存
【发布时间】: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


【解决方案1】:

这看起来像是移动语义的一个案例。确保Tf1/2/3 支持移动语义,并将示例更改为

some_function_signature() 
{
    T a;
    T b = f1(std::move(a));
    T c = f2(std::move(b));
    T d = f3(std::move(c));
    ...
}

这将允许T f1(T&& t) 回收移入的图像。

【讨论】:

  • ... 如果有东西拒绝移动,请使用std::unique_ptr<> 作为第二选择
【解决方案2】:

你可以试试这样的:

T d; 
{
    T c; 
    {   
        T b; 
        {   
            T a; 
            b = f1(a); 
        } //a goes out of scope and is destroyed here 
        c = f1(b); 
    } //b goes out of scope and is destroyed here
    d = f3(c);  
}//c goes out of scope and is destroyed here

【讨论】:

  • 这正是@Biffen 在他的 cmets 中所建议的(根据我的问题)。
  • 好的。如果为 T 定义了 move 并且函数支持它,这是一个更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 2012-09-24
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多