【问题标题】:Why the memory do not release after funciton call?为什么函数调用后内存不释放?
【发布时间】:2014-11-24 10:35:37
【问题描述】:

请参阅下面的代码:

void foo() {
  std::ifstream f("data");
  string line;
  vector<string> r;
  while(getline(f, line)) {
    r.push_back(line);
  }
  f.close();
  r.resize(0);
}

int main(int argc, char *argv[])
{
  foo();
  cout << "load done" << endl;
  while(1) {;}
  return 0;
}

我使用 while(1) 循环检查 htop 工具中的内存使用情况,r 可能使用 5GB RES,但在打印 load done 之后,RES 仍然需要 5GB。有什么问题?

【问题讨论】:

  • vector 将内存返回给分配器,但分配器可能不会将其返回给操作系统,它不是必需的。
  • 请不要在您的问题上附加随机标签。 [C] 与此无关; std::vector&lt;&gt; 根本不是 C 类型。

标签: c++ memory stl heap-memory htop


【解决方案1】:

调整大小并不能保证底层内存会被释放。

您应该尝试使用shrink_to_fit,这将减小容器的容量以适应其大小。

【讨论】:

  • 不久之后向量被破坏
  • @sp2danny 这是一个很好的观点。尽管如此,不将 5gb 返回到操作系统还是很奇怪。也许 OP 的观察是不正确的。
  • 保证调整大小不会释放任何底层内存(至少是间接的,因为它不允许使任何迭代器无效)。
  • 但是分配在栈空间中
  • 这不能回答问题,因为在向量对象被破坏后会检查内存使用情况。
【解决方案2】:

我认为 vector klass 的擦除和/或清除功能会为您做到这一点。 cpusplus.com

上还有一个非常好的矢量文档

【讨论】:

    猜你喜欢
    • 2016-07-19
    • 2012-10-10
    • 2017-05-25
    • 1970-01-01
    • 2013-12-23
    • 2013-01-12
    • 2014-12-27
    • 1970-01-01
    相关资源
    最近更新 更多