【问题标题】:Does Erase deletes heap memory used by element of stl unordered map是否擦除 std unordered_map 的元素使用的已删除堆内存
【发布时间】:2020-04-23 21:17:17
【问题描述】:

我有一个 int 和 string 的无序映射,通过引用将值插入其中。我想从映射中删除一些元素并减少使用的 malloc 内存,但我看不到内存减少。 是否可以使用擦除来减少 malloc 内存?擦除后 rehash 会有所帮助吗?

typedef typename std::unordered_set<N> ChangeObjSet;
ChangeObjSet _changeObjSet;

template <class N>
void MdmNameCacheImplMIWithStripEscape<N>::insertChangedStatus(const N &obj)
 {
    _changeObjSet.insert(obj);
 }

typename ChangeObjSet::iterator it = _changeObjSet.begin();
   for(;it != _changeObjSet.end();)
    {
     auto s = it;
    it++;
   _changeObjSet.erase(s);
}

【问题讨论】:

  • “我看不到内存减少”这是什么意思?您如何看待减少?
  • 如果您可以向我们展示一些代码,例如地图的定义以及如何插入元素,甚至是一个最小的可重现示例,问题可能会更清楚。
  • @churill 添加代码
  • @foreknownas_463035818 删除某些元素后减少 malloc 内存
  • 这是什么意思?使用地图时不涉及malloc(至少不可见)

标签: c++ stl unordered-map erase


【解决方案1】:

我正在使用 linux stat 流来获取 malloc 内存

操作系统分配给您的进程的内存不一定与您当前使用的内存相同。为每个被删除的对象释放内存给操作系统将是非常低效的。在进程终止之前,您可能会看到分配给进程的内存没有减少。

【讨论】:

    【解决方案2】:

    如果项目本身存储在地图中(而不是指针),则在使用擦除时将被删除。 擦除后地图本身是否缩小可能取决于您使用的特定地图的实现。

    一些实现可能会为新插入的项目重用以前删除的表条目,尽管我认为大多数实现不会。你在使用 STD 库吗?

    【讨论】:

    • 我用的是stl set
    • @foreknownas_463035818 我在地图中遇到问题并同时设置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2014-05-22
    • 2016-11-22
    相关资源
    最近更新 更多