代码之家  ›  专栏  ›  技术社区  ›  Jacob

释放分配的内存

  •  2
  • Jacob  · 技术社区  · 14 年前

    这种做法好吗?或者我应该替换 { } 有功能吗?它可以重用(我承认),但我这样做的唯一动机是取消分配 colsum 巨大的 不需要这样我就可以释放分配的内存。

     vector<double> C;
     {
      vector<double> colsum;
      A.col_sum(colsum);
      C = At*colsum;
     }
     doSomething(C);
    
    5 回复  |  直到 14 年前
        1
  •  13
  •   bshields    14 年前

    在我的书中,使用括号来限定自动变量的范围是可以的,但是一般来说,如果你发现自己经常这样做,特别是在同一个函数中多次这样做,那么你的函数可能做了太多不同的事情,应该被分解。

        2
  •  5
  •   Cogwheel    14 年前

    向量的数据总是动态分配的。只有簿记数据存储在堆栈上。即使不是这样,堆栈内存分配基本上是免费的。在大多数体系结构中,从堆栈中释放只是改变寄存器的值。

    关于动态释放,它必须在一个或另一个点(特别是函数的末尾)释放。在你想分配更多的内存而内存不足之前,你不会因为内存分配而丢失任何东西。在你真正遇到问题之前,是否真的需要关注解除分配发生的准确时间?

    但重点是什么?你似乎真的过早地关注自己的优化。

        3
  •  3
  •   Justin Summerlin    14 年前

    Vector不在堆栈上存储内存。只有向量对象本身存储在那里,它不是很大。像这样限定它的作用域会强制销毁,从而释放它分配的内存。

    另外,我不确定ISO中是否指定了实现必须从堆栈中弹出子范围变量。

        4
  •  3
  •   David Rodríguez - dribeas    14 年前

    正如其他人所指出的,向量内存没有在堆栈中分配。如果你想尽早释放这些记忆,常用的习惯用法是:

    vector<double> C;
    vector<double> colsum;
    A.col_sum(colsum);
    C = At*colsum;
        std::vector<double>().swap(colsum);
    doSomething(C);
    

    请注意 colsum.resize(0) colsum.clear() 不需要释放可用的内存,而且在许多情况下,他们不会假设如果向量以前增长到那个大小,那么它很可能会再次这样做。

        5
  •  0
  •   5ound    14 年前

    如果内部代码将在其他地方重用,请将其分离为一个函数。如果内部代码经常被调用(比如在循环中),那么它可能需要被重构,这样向量就不会在循环中不断地被创建和破坏。否则,我不认为按你的建议去做是不好的做法。