C++STL中map内存彻底释放方法_c++ map 手动释放-程序员宅基地

技术标签: 内存释放  unordered_map  计算机程序原理  STL  map  

最近遇到一个特别占内存的需求。使用STL map/unordered_map,内存无法得到正确释放。再次响应请求,会出现内存溢出的情况。

[6453149.107435] Memory cgroup out of memory: Kill process 54949 (******) score 1001 or sacrifice child
[6453149.117193] Killed process 54779 (******) total-vm:106091668kB, anon-rss:104842716kB, file-rss:1088kB

传统的STL内存释放方法

我们知道,STL容器调用clear()方法,通常只是使得容器内部的对象通通析构,但容器本身的内存无法得到释放。即篮子里面东西拿走了,篮子占的空间还在,这样是为了方便下次存放新的对象时,不需要再次申请空间。
其他同学的blog中有很多例子,即clear()后,容器的size为0,但capacity不变,链接

  • 通过swap()空容器,来彻底释放容器占用的capacity.
   vector<int> vec(10000,-1);
   vector<int>().swap(vec);

但是这种方法只对vector, string这两个容器有效,这里有大牛的解释;

对于map,set,unordered_map等容器,调用clear(), swap()都无法使得内存真正释放。虽然很多地方谈到,这一现象(内存被保留下来)是正常的,并不需要担心。但是当大量使用堆内存存放不同的数据结构,会造成严重的内存碎片从而导致内存泄漏问题。

实验现象

一段简单的代码看一下:

#include <iostream>
#include <map>
using namespace std;
void func()
{
        map<string,string> mp;
        int i = 5000000;
        while(i--)
            mp.insert(make_pair(to_string(i),string("hell000o")));
        map<string,string>().swap(mp);
}
int main()
{
        func();
        cout <<"done."<<endl;
        while(1);
}

持续使用top观察内存,发现内存一直持续为最后的峰值。
内存不会下降

解决方法

只需添加一行,malloc_trim(0); 这一行代码会将空闲的堆内存归还给操作系统,供其他进程使用。

#include <iostream>
#include <map>
#include <malloc.h>
using namespace std;
void func()
{
        map<string,string> mp;
        int i = 5000000;
        while(i--)
            mp.insert(make_pair(to_string(i),string("hell000o")));
        map<string,string>().swap(mp);
}
int main()
{
        func();
        cout <<"done."<<endl;
        malloc_trim(0);
        while(1);
}

内存被释放

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zenhox/article/details/103350719

智能推荐

Vue基础知识总结 1:Vue入门-程序员宅基地

文章浏览阅读8.3w次,点赞167次,收藏1.1k次。Vue基础教程系列,打造精品专栏。_vue

前端之SEO搜索引擎优化_前端seo-程序员宅基地

文章浏览阅读1.8k次。SEO(Search Engine Optimization)是指通过优化网站的内容、结构和技术,提高网站在搜索引擎中的排名,从而增加网站的曝光度和流量。_前端seo

软链接和硬链接区别-程序员宅基地

文章浏览阅读8.4k次,点赞17次,收藏89次。一、软链接:又被叫为符号链接,它包含了到原文件的路径信息。创建软链接:ln -s file link二、硬链接:是对原文件起了一个别名。创建硬链接:ln file link1.本质:硬链接:本质是同一个文件软链接:本质不是同一个文件2.跨设备硬链接:不支持软链接:支持3.inode硬链接:相同软链接:不同4.链接数硬链接:创建新的硬链接,链接数会增加,删除硬链接,链接数减少软链接:创建或删除,链接数不会变化5.文件夹硬链接:不支持软链接_软链接和硬链接区别

用栈来实现括号匹配问题_js 栈 多层成对括号-程序员宅基地

文章浏览阅读1.8k次。在这里只做简单的一个括号匹配的问题其实思想都是一样的,若碰到左的,都入栈,右的,且原来的栈不为空,则拿出来进行匹配,成功了则继续往下做,否则,直接跳出循环。在这里为了省略起见,用了stl#include#include#include#includeusing namespace std;int main() { int i, j, k, n, m; char s[100_js 栈 多层成对括号

操作系统原理与Linux实践教程申丰山版习题2的2-3答案_操作系统原理与linux申丰山课后答案-程序员宅基地

文章浏览阅读9.5k次,点赞4次,收藏47次。习题2部分答案2-3①先来先服务算法②最短作业优先算法③最短作业优先算法④最短剩余时间优先算法⑤抢占式优先数算法⑥时间片轮转算法(每个作业获得2min长的时间片)⑦最高响应比优先算法2-35个批处理作业A~E到达系统的时间、需要运行的时间及各自的优先级如下表所示,分别采用先来先服务算法、最短作业优先算法、最短作业优先算法、最短剩余时间优先算法、抢占式优先数算法、时间片轮转算法(每个作业获得2m..._操作系统原理与linux申丰山课后答案

pde中微元分析法的主要思想_销售部如何做SWOT分析:运用的管理工具PEST分析法,波特五力模型...-程序员宅基地

文章浏览阅读364次。从0开始学管理:专注科学系统提升管理能力:基础 中层 高层 综合管理销售部SWOT分析报告:一、什么是SWOT分析?二、SWOT分析模式三、SWOT分析法的规则四、SWOT分析步骤一、什么是SWOT分析1、优势2、劣势3、机会4、威胁SWOT分析法:是用来确定企业自身的竞争优势、竞争劣势、机会和威胁,从而将公司的战略与公司内部资源、外部环境有机地结合起来的一种科学的分析方法。即基于内外部竞争环境和..._旷视波特五力模型

随便推点

多元回归预测 | Matlab主成分分析PCA降维,BP神经网络回归预测。PCA-BP回归预测模型_bp多元回归预测模型-程序员宅基地

文章浏览阅读458次。多元回归预测 | Matlab主成分分析PCA降维,BP神经网络回归预测。PCA-BP回归预测模型_bp多元回归预测模型

"野马"中的桌面Java特性_access野马-程序员宅基地

文章浏览阅读1.4k次。Sun的桌面Java客户端组正在为下一版Java(代码名"野马")的某些重要特性和功能而工作;我们认为在此细说其中的某些亮点也许对您有所帮助。我们尽量给附加信息添加链接(如Bug ID或其它文章)并且在开发进程中告诉你每项特性添加到“野马”中的构建号的信息。并且随着野马的发布,这不仅只是说说而已,你可以随时从 http://mustang.dev.java.net下载到野马的最近版本。在此我们尽量_access野马

JDK基础脚本工具总结_基础工具总结-程序员宅基地

文章浏览阅读160次。本文摘自《深入理解Java虚拟机 第三版》,如此书的作者所说,虽然现在已经有个各种可视化工具实现了对命令行工具的封装,方便且体验良好。但是不论JDK发展到什么版本,或者工具如何封装,这些底层实现的基本思想都不会过时,都值得广大开发人员学习。1 基础工具:用于支持基本的程序创建和运行名称主要作用appletviewer在不适用web浏览器的情况下运行和调试Applet ,JDK11中被移除excheck检查jar冲突的工具,JDK9中被移除jar创建和管理jar文件_基础工具总结

【深度学习】ICPR 2022|3DUNet:卷积+胶囊强强联手,医学图像分割的新良方-程序员宅基地

文章浏览阅读3.1k次。作者丨ZiyangLi编辑丨极市平台导读卷积神经网络(CNN)目前在医学图像分割领域应用广泛。本文基于胶囊网络,设计了一种包含卷积与胶囊编码器的3DUNet架构并应用于医学图像分割,在减少推理时间的同时性能远优于以往UNet类架构。论文地址:https://arxiv.org/abs/2205.09299一、为什么要引入胶囊网络(Capsule Network)?..._icpr 2022 papers

【UE4】【笔记】5、UE4学习笔记 LOD与合并静态网格体_ue的lod功能-程序员宅基地

文章浏览阅读6.2k次,点赞2次,收藏20次。UE4官方视频学习笔记——LOD与合并静态网格体大纲如下:​​UE4LOD自动创建工具LOD自动创建工具选择一个静态网格体,打开静态网格编辑器,并在细节面板中找到LOD Settings分组:该分组中有一个属性“LOD Group”:该属性中预存了许多类型的分组,比如Foliage、HighDetail等,当你选择其中一个的时候,UE4将会读取BaseEngine.ini中的配置数据,并按照预设好的配置为该静态网格体生成指定规格的LOD数据:手动修改LOD参数假如我们应用了Larg_ue的lod功能

无公网IP,SSH远程连接Linux CentOS服务器【内网穿透】_如何ssh到一个非固定ip的linux-程序员宅基地

文章浏览阅读972次,点赞21次,收藏26次。[TOC]本次教程我们来实现如何在外公网环境下,SSH远程连接家里/公司的Linux CentOS服务器,无需公网IP,也不需要设置路由器。_如何ssh到一个非固定ip的linux

推荐文章

热门文章

相关标签