假设我们现在有以下代码:

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. 前端面霸系列(1):doctype 、Quirks Mode &amp; Standards Mode 、document.compatMode
  2. jQuery打造智能提示插件
  3. php 批量去空格和注释
  4. [页面滚动到底部]jquery $(window).height()取值等于$(document).height()的问题
  5. Web大文件上传控件-asp.net-bug修复-Xproer.HttpUploader6.2
  6. Struts2文件上传
  7. (转)最强Android模拟器genymotion的安装与配置
  8. 手把手VirtualBox虚拟机下安装rhel6.4 linux 64位系统详细文档
  9. SQL-SERVER2008登录错误233
  10. 配置rhel 6.4(64位)安装使用syslog-ng 3.5
  11. 【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!
  12. Uip学习简介及网址
  13. Objective-C AVPlayer播放视频的使用与封装
  14. mybatis源码之PreparedStatementHandler
  15. zabbix优化,配合文件,zabbix_get命令
  16. excel 删除重复项
  17. 北京大学信息科学技术学院本科生课程体系课程大纲选登——计算机网络与WEB技术
  18. 磨刀不误砍柴工——统一日志系统 Log4Net/ExceptionLess
  19. Codeforces 311B Cats Transport【斜率优化DP】
  20. 8VC Venture Cup 2016 - Final Round D. Preorder Test 二分 树形dp

热门文章

  1. UVA 12325 Zombie&#39;sTreasureChest 宝箱 (分类枚举)
  2. Spark集群任务提交
  3. 关于 NetBackup 应答文件(/tmp/NBInstallAnswer.conf)
  4. async/await的使用以及注意事项
  5. 树莓派 - 修改pi账号密码,开启root账号
  6. JavaScript onkeydown事件入门实例(键盘某个按键被按下)
  7. javaweb基础(20)_JavaBean总结
  8. 01_6_Struts_ActionWildcard_通配符配置
  9. NOIP模拟赛 czy的后宫4
  10. 【思维题 单调栈】loj#2430. 「POI2014」沙拉餐厅 Salad Bar