C++之Effective STL学习笔记Item7
2024-08-29 20:34:10
假设我们现在有以下代码:
void doSomething()
{
vector<Widget*> vwp;
for (int i = 0; i < SOME_MAGIC_NUMBER; ++i)
vwp.push_back(new Widget);
... // use vwp
} // Widgets are leaked here!
代码中的Widget为一个类,显然,此段代码会造成内存泄露。函数执行结束之后,每一个vwp的元素会被destroy, 但是并不会delete我们使用的Widget对象。Oh, no!内存泄露了!
有人可能要讲了,这个不简单嘛,我把它们delete了不就完事了。在doSomething函数的最后增加如下代码:
for( vector<Widget*>::iterator i = vwp.begin(); i != vwp.end(); ++i)
delete *i;
可是,对于这种情况,有没有一些更优雅的方法呢?或许可以利用函数对象来完成这个,看似高端大气一点而已:
struct DeleteObject { // templatization and base class removed here
template<typename T> // templatization added here
void operator()(const T* ptr) const
{
delete ptr;
}
}; void doSomething()
{
deque<SpecialString*> dssp;
…
for_each( dssp.begin(), dssp.end(),
DeleteObject()); // ah! well-defined behavior!
}
这样的方法貌似不错,我们很优雅的完成了指针的释放。可是就没有再好点的方法了吗?好消息总是来的比较晚,智能指针登场了,在C++11的标准中,智能指针位于std命名空间的<memory>头文件中,需要在使用的时候加入相关的语句(这里我们使用share_ptr):
#include <memory>
using std::shared_ptr;
则,上述问题可以按照如下方式解决:
void doSomething()
{
typedef shared_ptr<Widget> SPW;
vector<SPW> vwp;
for (int i = 0; i < SOME_MAGIC_NUMBER; ++i)
vwp.push_back(SPW(new Widget));
...
}
感谢阅读,希望能帮到大家!
Published by Windows Live Writer.
最新文章
- 前端面霸系列(1):doctype 、Quirks Mode &; Standards Mode 、document.compatMode
- jQuery打造智能提示插件
- php 批量去空格和注释
- [页面滚动到底部]jquery $(window).height()取值等于$(document).height()的问题
- Web大文件上传控件-asp.net-bug修复-Xproer.HttpUploader6.2
- Struts2文件上传
- (转)最强Android模拟器genymotion的安装与配置
- 手把手VirtualBox虚拟机下安装rhel6.4 linux 64位系统详细文档
- SQL-SERVER2008登录错误233
- 配置rhel 6.4(64位)安装使用syslog-ng 3.5
- 【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!
- Uip学习简介及网址
- Objective-C AVPlayer播放视频的使用与封装
- mybatis源码之PreparedStatementHandler
- zabbix优化,配合文件,zabbix_get命令
- excel 删除重复项
- 北京大学信息科学技术学院本科生课程体系课程大纲选登——计算机网络与WEB技术
- 磨刀不误砍柴工——统一日志系统 Log4Net/ExceptionLess
- Codeforces 311B Cats Transport【斜率优化DP】
- 8VC Venture Cup 2016 - Final Round D. Preorder Test 二分 树形dp
热门文章
- UVA 12325 Zombie&#39;sTreasureChest 宝箱 (分类枚举)
- Spark集群任务提交
- 关于 NetBackup 应答文件(/tmp/NBInstallAnswer.conf)
- async/await的使用以及注意事项
- 树莓派 - 修改pi账号密码,开启root账号
- JavaScript onkeydown事件入门实例(键盘某个按键被按下)
- javaweb基础(20)_JavaBean总结
- 01_6_Struts_ActionWildcard_通配符配置
- NOIP模拟赛 czy的后宫4
- 【思维题 单调栈】loj#2430. 「POI2014」沙拉餐厅 Salad Bar