【问题标题】:Free up memory immediately by swap trick (C++) [closed]通过交换技巧立即释放内存(C++)[关闭]
【发布时间】:2020-05-01 00:32:15
【问题描述】:

我有一个非常大的向量,如下所示。

vector<vector<int>> a(100000, vector<int>(100000);
// do some work using a here
......

工作完成后,我使用

vector<vector<int>>().swap(a);

为了释放“a”使用的内存立即。我加了

sleep(100)

交换后使用“top”命令查看内存使用是否立即减少。但我观察到什么都没有改变。这里发生了什么?

【问题讨论】:

  • 它不起作用的具体症状是什么?你在测量什么来看看它是否有效?
  • 你是如何测量内存的?无法保证 C/C++ 会将虚拟内存返回给操作系统,或者在操作系统认为该内存不活动之前多长时间。
  • 内存被释放。如果您声称不是这样,请不要期望立即在任务管理器中看到它。
  • @yicepeh969 正如已经指出的那样,任务管理器中显示的信息反映了操作系统关于您正在运行的进程的信息。 std::vector 默认使用的内存分配类型(newdelete)通常由进程内的运行时层处理,而不是由操作系统直接处理。仅仅因为您将一堆内存返回给newdelete 在下面使用的内存分配器并不意味着内存分配器也将它返回给操作系统。这只是意味着内存分配器可能会在您下次分配某些东西时再次开始分配此内存的位......
  • here 回答了一个类似的问题 - 我无法立即找到更好的副本,但它比评论更详细。

标签: c++ gcc optimization memory vector


【解决方案1】:

要立即从内存中清除矢量,您应该这样做:

v.clear();
v.shrink_to_fit();

【讨论】:

  • cppreference: "将capacity() 减少为size() 是一个非绑定请求。请求是否被满足取决于实现。"
  • 这根本不会改变任何东西(在引入 shrink_to_fit() 之前,使用临时空向量进行交换是一种方法),但内存仍然不必立即返回给操作系统。
  • @Aconcagua 当然,但我不知道作者所说的“内存”是指操作系统内存。
  • @Aconcagua 该问题在我回答后已被编辑
  • 啊,错过了,抱歉。这就是那些基本编辑的问题,使以前完全好的答案无效......
【解决方案2】:

它应该可以工作,你可能在代码的其他地方有错误,或者你没有正确判断内存是否被释放。

您可以使释放更通用 - 这样它就可以处理任何事情,而无需在交换中执行任何不必要的操作。交换包括三个动作。您可以通过移动和默认重新初始化来获得相同的结果。

   {auto x=std::move(a);a={};}

x 窃取a 的内存并在离开作用域后被销毁。 a={}; 在大多数情况下不是必需的,但根据标准,moving from 对象被允许处于相当奇怪的状态之后。

【讨论】:

  • 这相当于std::exchange(a, {})
  • @Kerndog - 确实如此。不过,老实说,目前我更喜欢较长的版本而不是接近的版本。如果代码编译中存在错误并且您在std::exchange 中找到它...直到concepts 是在线模板可能会很麻烦。
  • std::vector 中的错误?我不关注
  • @Kerndog 我的意思是一般的释放方法。但是对于vector来说确实没必要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
相关资源
最近更新 更多