我有一个类,它有一个类型字段unordered_map
。我在我的应用程序中创建了该对象的单个实例,该实例被包装在shared_ptr
。该对象非常消耗内存,我想在使用完它后立即将其删除。然而,重置指针仅仅释放了对象占用的一小部分内存。如何强制程序释放该对象占用的所有内存?
以下模拟程序重现了我的问题。 for 循环打印垃圾只是为了给我足够的时间来观察使用的内存top
。析构函数在之后被调用reset()
。此外,紧接着,使用的内存从大约 2 GB 下降到 1.5 GB。
#include <iostream>
#include <memory>
#include <unordered_map>
using namespace std;
struct A {
~A() {
cerr << "Destructor" << endl;
}
unordered_map<int, int> index;
};
int main() {
shared_ptr<A> a = make_shared<A>();
for (size_t i = 0; i < 50000000; ++i) {
a->index[2*i] = i + 3;
}
// Do some random work.
for (size_t i = 0; i < 3000000; ++i) {
cout << "First" << endl;
}
a.reset();
// More random work.
for (size_t i = 0; i < 3000000; ++i) {
cout << "Second" << endl;
}
}
编译器:g++ 4.6.3。
GCC 的标准库在其默认配置中没有“STL 内存缓存”(几乎每个人都使用)std::allocator
只是打电话new
and delete
,这只是调用malloc
and free
. The malloc
实现(通常来自系统的C库)决定是否将内存返回给操作系统。除非您使用的是没有虚拟内存的嵌入式/受限系统(或者您已经关闭了过度提交),否则您可能会不想退货——让图书馆做它想做的事。
操作系统不需要收回内存,它可以毫无问题地为其他应用程序分配千兆字节的虚拟内存。每当人们认为他们需要返回内存时,通常是因为他们不了解现代操作系统如何处理虚拟内存。
如果您确实想强制 C 库将内存返回给操作系统,C 库可能会提供非标准挂钩来执行此操作,例如,对于 GNU libc,您可以调用malloc_trim(0)
强制将最顶层的空闲内存块返回给操作系统,但这可能会使您的程序下次需要分配更多内存时变慢,因为它必须从操作系统取回内存。看https://stackoverflow.com/a/10945602/981959(以及那里的其他答案)了解更多详细信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)