STL容器存储的内容动态分配情况下的内存管理

主要分两种情况:存储的内容是指针;存储的内容是实际对象。

看以下两段代码,

  1. typedef pair<VirObjTYPE, std::list<CheckID>*> VirObj_CheckID_pair;
  2. class LangChecker
  3. {
  4. public:
  5.     LangChecker();
  6.     ~LangChecker();
  7.    
  8.     void Register(VirObjTYPE type, CheckID id);
  9. private:
  10.     std::map<VirObjTYPE, std::list<CheckID>*> _registered_checker;
  11.     std::map<VirObjTYPE, std::list<CheckID>*>::iterator _registered_iter;
  12. };
  1. void LangChecker::Register(VirObjTYPE type, CheckID id)
  2. {
  3.     _registered_iter = _registered_checker.find(type);
  4.     if(_registered_iter == _registered_checker.end())  //not found
  5.     {
  6.         std::list<CheckID>* newlist = new list<CheckID>;
  7.         (*newlist).push_back(id);
  8.         _registered_checker.insert(VirObj_CheckID_pair(type, newlist));
  9.     }
  10.     else
  11.     {
  12.         (*(*_registered_iter).second).push_back(id);
  13.     }
  14. }
  15. LangChecker::~LangChecker()
  16. {
  17.     for(_registered_iter = _registered_checker.begin(); 
  18.             _registered_iter != _registered_checker.end(); _regeristered_iter++)
  19.     {
  20.         delete (*_registered_iter).second;
  21.     }
  22. }
第二段代码中,Register函数动态生成指针newlist指向list<CheckID>对象,对象的内存分配在堆上;然后,将该指针insert到map容器——_registered_checker中。注意,STL容器在运行push_back/push_front/insert等操作时,会又一次为要插入进来的内容new对应的内存(在这里,会为type和newlist指针(!不是newlist指向的对象!)分配堆内存——32位系统下指针仅仅占4字节),这些操作分配的内存STL自己会管理不用我们担心,newlist指针也是局部变量自己会死亡。insert之后该map容器中的VirObjTYPE=type、list<CheckID>指针和newlist都指向一样的堆内存注意,newlist所指向的堆内存,是须要我们自己来释放的,这一步在析构函数里完毕比較合适。

    以下是第二种写法,将数据成员_registered_checker类型改为,
  1. std::map<VirObjTYPE, std::list<CheckID>> _registered_checker;
  2. std::map<VirObjTYPE, std::list<CheckID>>::iterator _registered_iter;
对应的函数改为,
  1. typedef pair<VirObjTYPE, std::list<CheckID>> VirObj_CheckID_pair;
  2. void LangChecker::Register(VirObjTYPE type, CheckID id)
  3. {
  4.     _registered_iter = _registered_checker.find(type);
  5.     if(_registered_iter == _registered_checker.end())  //not found
  6.     {
  7.         std::list<CheckID>* newlist = new list<CheckID>;
  8.         (*newlist).push_back(id);
  9.         _registered_checker.insert(VirObj_CheckID_pair(type, *newlist));
  10.         delete newlist;
  11.     }
  12.     else
  13.     {
  14.         (*_registered_iter).second.push_back(id);
  15.     }
  16. }
这时,map容器里的第二成员不再是指针而是实际的对象了,所以在insert时要把对应的对象*newlist插入到map中,这时,insert操作会为type和*newlist新分配堆内存(这里分配的是list<CheckID>对象、而非指针的内存),这块内存会由STL自己负责释放。insert后map容器中的VirObjTYPE=type、list<CheckID>=*newlist。注意,我们new出来的newlist所指向的内存,须要我们在newlist变量失效之前手动释放!所以,这里的内存释放分别由STL和Register函数完毕,析构函数里就不用做什么了。

    比較两种写法,后者申请和释放list<CheckID>对象内存的动作更为频繁,是前者的两倍。当list<CheckID>对象较大(仅仅要比指针的4字节大)时,性能上来说前者更好。

转载于:https://www.cnblogs.com/mfrbuaa/p/4301012.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一分二功率分配器_一文学会微波功率分配器

功率分配器是微波电路设计中常用的一个无源元器件&#xff0c;简称功分器&#xff0c;顾名思义&#xff0c;就是把一路输出功率按照一定的比例分配成N路功率输出的一种微波元器件&#xff0c;如下图所示&#xff0c;A端口进入的信号分成两路信号从C1和C2端口输出。当然&#xf…

MinGW编译boost库

介绍 在windows下编译boost可以选择msvc和mingw两种方式&#xff0c;这里介绍使用mingw方式编译,msvc也是类似的操作 源码下载 例如1.48.0http://www.boost.org/users/history/version_1_48_0.html 使用不同的版本时将version_1_48_0替换即可 编译 编译 b2.exe 进入boost…

软件工程——理论、方法与实践 第一章

第一章 主要分为1、软件2、软件工程3、软件工程知识体系4、软件工程职业道德规范四部分。软件是人类思维创造的杰作,并成为人类现代生活的催化剂;第一部分软件对软件的特性、发展和软件的危机进行了讲解&#xff0c;主要描述软件是计算机程序、规程以及运行计算机系统可能需要…

高德地图定位精度多少米_中美俄卫星定位精度分别是多少?美0.1米,俄10米,中国呢?...

在古代&#xff0c;悬于天际的北斗七星就被那时候的人们当做辨别方向的工具&#xff0c;在现代&#xff0c;太空之中的北斗卫星也在为人们指引方向&#xff0c;为了这一天的到来&#xff0c;我们等待了太久太久。1993年发生的银河号事件里&#xff0c;美国宣称我国商船携带了违…

find_path、find_library备忘录

find_path用于查找包含的头文件&#xff0c;其查找顺序为&#xff1a;从CMAKE_INCLUDE_PATH中查找。从系统默认头目录即/usr/include、/usr/local/inlucde中查找。其中如果从CMAKE_INCLUDE_PATH中查找的话&#xff0c;需要在~/.profile或者/etc/profile中设置&#xff08;注意&…

Android成长日记-Android布局优化

Android常用布局 1. LinearLayout(线性布局) 2. RelativeLayout(相对布局) 3. TableLayout(表格布局) 4. AbsoluteLayou(绝对布局) 5. FrameLayout(帧布局) 低--------------使用量------------------高 4->3->5->1->2 Android布局原则 (1) 尽量多使用LinearLayout…

练字格子纸模板pdf_a4田字格练字纸打印版-练字标准田字格模板-a4打印版下载最新免费excel版-西西软件下载...

练字标准田字格模板-a4打印版是一份a4田字格练字模板下载&#xff0c;硬笔书法练习田字格模板-标准A4打印版、标准田字格模板-每日练字、硬笔书法练习田字格模板-标准A4打印版、标准田字格模板-A4打印、硬笔书法练习田字格模板可以使用。word制作练字田字格1、点击word“表格”…

vcpkg

git clone https://github.com/Microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh ./vcpkg integrate install./vcpkg install curl[tool] ./vcpkg.exe install pthreads:x64-windows

DB2 常用命令小结

1、 打开命令行窗口 #db2cmd 2、 打开控制中心 # db2cmd db2cc 3、 打开命令编辑器 db2cmd db2ce 操作数据库命令 4、 启动数据库实例 #db2start 5、 停止数据库实例 #db2stop 如果你不能停止数据库由于激活的连接&#xff0c;在运行db2stop前执行db2 force application all…

以字符串形式打印宏值

#define PI 3.141592654 #define xstr(s) str(s) #define str(s) #s int main() {string str1 xstr(PI);const char* str2 xstr(PI);cout << str1 << endl;cout << str2 << endl; }

解决cocos2dx调用removeFromParent后报错问题

原因&#xff1a;cocos2dx的bug 解决办法&#xff1a; 放到action中&#xff0c;前面添加一个DelayTime延迟&#xff0c;代码如下 this->runAction(Sequence::create(DelayTime::create(0.1f),CallFuncN::create([&](Node* pNode){pNode->removeFromParent();}),NULL…

常量缓存与integer比较_吊打面试官系列:说说Integer缓存范围

本文主要大致思路为&#xff1a;不管从工作中还是面试&#xff0c;这篇文章都应该好好看完&#xff0c;本人认为是非常有用的。案例Integer是基本类型int的封装类。平时不管是入坑多年的小伙伴还在入坑路上的小伙伴&#xff0c;都应该知道的使用频率是相当高。下面模仿订单支付…

使用BIND安装智能DNS服务器(一)---基本的主从DNS服务器搭建

参考网址&#xff1a;http://www.unixmen.com/dns-server-installation-step-by-step-using-centos-6-3/   DNS(Domain Name System) 将主机名或者URLS翻译成IP地址。 例如&#xff1a;如果在浏览器输入网址 "www.unixmen.com" DNS server 将把这个域名翻译成和他…

openflow交换机 ryu_关于OpenFlow协议

SDN中两个重要元素&#xff1a;控制器(掌控全局&#xff0c;指挥网络内的设备工作)交换机(转发数据)控制器与网络设备通过OpenFlow协议进行通信OpenFlow交换机内有一个FlowTable&#xff0c;交换机按照流表转发数据&#xff0c;流表由控制器生成和维护。内有数据包匹配特征和数…

QT 语言切换

1. 代码里面需要切换语言的文字用tr包裹 2. 在工程pro文件目录下 3. 使用QT安装目录下的 Linguist程序增加中文字符串 4. 打开命令行 5. 执行 lrelease.exe ......\translations\zh_CN.ts

excel条形码字体_在Excel中批量生成条形码,竟如此简单!

条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等许多信息&#xff0c;因而在商品流通、图书管理、邮政管理、银行系统等许多领域都得到广泛的应用。那么如何在Excel中快速生成条形码呢&#xff1f;我们以前看到的方法有&am…

(视频) 《快速创建网站》 3.2 WordPress多站点及Azure在线代码编辑器 - 扔掉你的ftp工具吧,修改代码全部云端搞定...

本文是《快速创建网站》系列的第6篇&#xff0c;如果你还没有看过之前的内容&#xff0c;建议你点击以下目录中的章节先阅读其他内容再回到本文。 访问本系列目录&#xff0c;请点击&#xff1a;http://devopshub.cn/tag/wordpress-on-azure/ 1. 网站管理平台WordPress和云计算…

自定义外部协议使浏览器拉起本地程序

什么是自定义协议 由于我们的游戏需要在浏览器中调用NPAPI插件&#xff0c;而chrome移除了NPAPI的支持&#xff0c;导致游戏并不能很好的适配所有的浏览器&#xff0c;所以这个时候我们对于chrome浏览器用到了自定义浏览器协议这一标准。自定义浏览器协议允许在浏览器中使用pr…

hssfcolor 不建议使用_不建议使用微信双开的真正原因!

不少小伙伴都有两个甚至多个微信号&#xff0c;通常一个是自己的私人号&#xff0c;其它则用于工作&#xff0c;所以想要在手机中双开微信&#xff0c;这样使用起来更方便。不过使用 iPhone 的小伙伴就很郁闷了&#xff0c;为什么在 iPhone 上不能像部分安卓手机那样方便的双开…

【转】如何用css限制文字长度,使溢出的内容用省略号…显示

文章转自这里(现在貌似被黑了&#xff0c;建议不要点击了) ps&#xff1a;因在该地方没看到转载按钮&#xff0c;复制下存到这里以待自己方便&#xff0c;别人能看到帮助一下更是乐意之至&#xff0c;效果亲测可以实现&#xff0c;兼容IE、谷歌、火狐 由于文字内容长度的不确定…