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()
,最简单的选择就是其他人提到的。让它超出范围。
我的项目有 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()
,最简单的选择就是其他人提到的。让它超出范围。