c – 如何强制清除STL内存缓存?

我有一个类具有unordered_map类型的字段.我在我的应用程序中创建了这个对象的单个实例,它包含在shared_ptr中.该对象非常耗费内存,我想在使用它后立即将其删除.但是,重置指针只会释放对象占用的一小部分内存.如何强制程序释放对象占用的所有内存?

以下模拟程序重现我的问题. for循环打印垃圾只是给我足够的时间来观察顶部使用的内存.在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和delete,它只调用malloc和free. malloc实现(通常来自系统的C库)决定是否将内存返回给操作系统.除非你是一个没有虚拟内存的嵌入式/受约束系统(或者你已经关闭了过度提交),否则你可能不想返回它 – 让图书馆按照自己的意愿行事.

操作系统不需要内存,它可以为其他应用程序分配千兆字节的虚拟内存而不会出现问题.每当人们认为他们需要返回内存时,通常是因为他们不了解现代操作系统如何处理虚拟内存.

如果你真的想强制C库将内存返回给操作系统,那么C库可能会提供非标准的钩子,例如对于GNU libc,你可以调用malloc_trim(0)来强制最大的空闲内存块返回操作系统,但这可能会使你的程序下次需要分配更多的内存时,因为它必须从操作系统返回.有关详细信息,请参阅https://stackoverflow.com/a/10945602/981959(以及其他答案).

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...