释放分配的内存

时间:2010-07-14 17:20:19

标签: c++ raii

这是好习惯吗?或者我应该用函数替换{}之间的代码块?它可以重复使用(我承认),但我这样做的唯一动机是释放colsum,因为它是巨大的而不是必需的,这样我就可以释放分配的内存。

 vector<double> C;
 {
  vector<double> colsum;
  A.col_sum(colsum);
  C = At*colsum;
 }
 doSomething(C);

5 个答案:

答案 0 :(得分:13)

在我的书中使用括号来区分自动变量很好,但一般来说,如果你发现自己做了很多,特别是在同一个函数中多次,你的函数可能做了太多不同的事情,应该分解。 / p>

答案 1 :(得分:5)

向量的数据始终是动态分配的。只有簿记数据存储在堆栈中。即使不是,堆栈内存分配基本上是免费的。从堆栈中取消分配只是在大多数架构上更改寄存器的值。

修改

关于动态释放,必须在某一点或另一点(特别是函数的结尾)取消分配。你实际上没有丢失任何东西,只需要分配内存,直到你想分配更多而且还不够。在实际遇到某些问题之前,解除分配的确切时间是否真的需要关注?

<强> /修改

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

如果您想重构代码,请为了清晰起见而不是表现。

答案 2 :(得分:3)

Vector不会在堆栈中存储内存。只有矢量对象本身存储在那里,这不是很大。像这样确定它会强制破坏,这将释放它已分配的内存。

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

答案 3 :(得分:3)

正如其他人所指出的那样,向量存储器没有在堆栈中分配。如果你想早点释放那段记忆,那么常见的习语就是:

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()不需要释放可用内存,并且在许多情况下,他们不会假设如果向量增长到那个大小之前,很可能它会再做一次。

答案 4 :(得分:0)

如果内部代码将在其他地方重用,请将其分成一个函数。如果频繁调用内部代码(如在循环中),则可能需要重构内容,以便不在循环中不断创建和销毁向量。否则,我不认为做你建议的做法是不好的做法。