stl 容器上的 RAM 泄漏?

RAM leaks on stl containers?

我的项目有 RAM 限制,因为它包含大量数据操作。问题是,我注意到调用 std::set<std::pair<int64_t, int64_t>>::clear() 实际上并没有释放任何内存。重现问题的代码:

std::set<std::pair<int64_t, int64_t>> stltest;
for (size_t i=1; i<=250000; i++)
{
    stltest.insert({i, i});
}
std::cout << " "; // place for a breakpoint
stltest.clear();
std::cout << " "; // place for a breakpoint

在 ubuntu 20.04 上,标准 c++ 编译器占用 17.7 MB,并且不会返回。可能 clear() 只是将 size() 设置为零,但对内容不做任何事情,这很奇怪。是我傻还是我傻?能不能找回记忆,我真的很需要

编辑:尝试过手动创建新的和删除后仍然无法恢复我的记忆。

您可以让 stltest 超出范围,或者

{
    std::set<std::pair<int64_t, int64_t>> reclaim_memory;
    stltest.swap(reclaim_memory);
}

在一个新的范围内(所以括号很重要)这样分配的内存 当 reclaim_memory 超出范围时被释放。

Probably clear() just sets size() to zero, but does nothing with contents

没有。它会破坏元素并释放它们的内存。

Can I get the memory back

当然可以,如果您实施自己的 malloc 并替换标准的。

在实践中不,这不是一个有用的目标。

I really need it.

你认为你需要什么?你打算用它来创建更多的对象吗?因为这正是 malloc 的实现保留内存的目的。

关于 cppreference,它并没有详细说明,在 clear() 期间发生了什么......对于向量,cppreference 声明容量保持不变,因此它会破坏但不会解除分配.并简要浏览一下我的 clang 安装上的头文件,set 也只是破坏对象,似乎没有发生释放。然而,这 不是 内存泄漏。

我相信这是使用的底层函数...

template <class _Tp, class _Compare, class _Allocator>
void
__tree<_Tp, _Compare, _Allocator>::clear() _NOEXCEPT
{
    destroy(__root());
    size() = 0;
    __begin_node() = __end_node();
    __end_node()->__left_ = nullptr;
}

由于集合没有 shrink_to_fit(),最简单的选择就是其他人提到的。让它超出范围。