微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

stl 容器上的 RAM 泄漏?

如何解决stl 容器上的 RAM 泄漏?

我的项目有 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() 设置为零,但对内容没有任何作用,这很奇怪。是我笨还是我笨?能拿回记忆吗,我真的很需要。

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

解决方法

可能 clear() 只是将 size() 设置为零,但对内容没有任何作用

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

我能找回记忆吗

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

实际上不,这不是一个有用的目标。

我真的需要它。

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

,

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

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

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

,

在 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(),所以最简单的选项是其他人提到的。让它超出范围。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。