C++11之资源管理(一)

  资源管理一直是C++被其他语言(例如Java)诟病的地方。不可否认,垃圾回收是更为先进而且便捷有效的管理资源的手段,并且由于其内在的算法改进,它的速度和效率也在逐步提升。但是,毕竟垃圾回收使得程序员离系统内部又远了一步,不但使得程序员对程序内部发生的事情更加不了解(这也是我学了Java却不喜欢使用的原因),而且需要额外运行垃圾回收这段程序,其速率肯定不如自己手动管理好。

  随着C++11的推广,资源管理早已不是那么困难(C++11之前也能使用Boost库达到这种效果),new/delete这么难搞的配合基本上可以不用了,因为我们可以使用更为高效便利的标准库和智能指针。

  首先,对于在堆栈上建立对象的知识,可以参考以下链接http://www.cnblogs.com/sopc-mc/archive/2011/11/03/2235124.html

  现在,我们不需要再每次都new,然后总得记住要delete(否则内存泄露)。我们所要做的只是把原本希望new的对象交给智能指针管理,之后我们就不需要害怕因为忘记delete而造成内存泄露了,因为智能指针已经帮我们管理好了。那么,智能指针是如何做到这一点呢?其实这里用到了RAII(Resource Acquisition Is Initialization:资源取得时机便是初始化时机),这个RAII其实是利用了class的对象离开作用域时会自动调用析构函数来释放资源,比如:

 1 class local
 2 {
 3     ...
 4 };
 5
 6 void f()
 7 {
 8     local l;
 9     ...
10 } //leave the function f(), l was deleted by ~local()

当对象l 离开函数f()后,它便自动调用析构函数来释放资源。RAII要的就是这种自动(自动是关键!)调用析构函数的效果!智能指针其实就是一个class,托管了资源罢了,当你需要释放资源时,他就能自动调用自己的析构函数。

  接下来就是new数组的问题了,遇到数组我们就得和指针打交道了,指针太顽皮了,恐怕大家都不喜欢和它玩,何况现在我们还得处理new/delete的问题,这让人头都大了。幸好我们还有强大的标准库,这时我们使用vector和string就可以解决90%与数组有关的问题,而这两个东东又是这么容易使用!其实真的,现代的C++编程已经不用整天和指针打交道了,利用好标准库(还有Boost库!),C++编程真的变得高效且方便。

  到这里,我们可以总结了:(1)对于单个对象,用智能指针;

              (2)对于对象数组,用标准库的vector和string。

  最后我引用Scott Meyers的一句话结束本文章:“在一个完美世界中你将倚赖这样的classes来处理和资源之间的所有互动,而不是玷污双手直接处理原始资源。

时间: 2024-10-02 11:48:03

C++11之资源管理(一)的相关文章

C++11的资源管理:泛化的RAII

RAII被认为是c++资源管理的最佳范式,但是c++98中用RAII必须为要管理的资源写一个类,这样一来RAII的使用就有些繁琐了.C++11有了lambda和function后,我们就可以编写泛化的RAII,实现ScopeGuard,优雅地解决这个问题.本文主要参考刘未鹏的博客. 主要代码如下 class ScopeGuard { public: explicit ScopeGuard(std::function<void()> onExitScope) : onExitScope_(onE

ASP.NET通用权限框架 权限管理系统源码jquery 精美UI源码

开发工具 VS2010 .sql2005.2008等(在Sql server数据执行脚本即可)  VS2010 打开保证本地运行成功(数据库.源代码)  设计结构采用标准三层设计,是一套非常成熟的框架程序,可直接用于大型系统基础框架快速开发,及程序员学习. 1.菜单导航管理 2.操作按钮 3.角色管理 4.部门管理 5.用户管理(用户权限) 6.用户组管理(设置成员,用户组权限) 7.系统配置(动态配置系统参数) 8.附加属性(自定义属性) 9.系统日志(异常记录) 10.数据库备份/还原 11

Hadoop2.2.0伪分布式之MapReduce简介

一概念. mapReduce是分布式计算模型.注:在hadoop2.x中MapReduce运行在yarn上,yarn支持多种运算模型.storm.spark等等,任何运行在JVM上的程序都可以运行在yarn上. MR有两个阶段组成,Map和Reduce,用户只需要实现Map()和reduce()两个函数(且这两个函数的输入和输出均是key -value的形式)即可实现分布式计算.代码示例略. MapReduce设计框架: 在1.0中:,管理者:Job Tracker:被管理者:Task Trac

vue版本根据当前路由匹配到根父节点并且激活

页面布局 我的项目是有两种布局方式的, 一种是左侧布局,还有一种是顶部+左侧的布局,在这里主要讲顶部+左侧布局  因为左侧的相对简单,会自行匹配 业务场景 当页面刷新的时候,要回到原来的页面,并且要激活正确的一级和二级菜单 首先  在data中创建数据 data() { return { menus: [],//菜单数据是id pid 加上children格式的 parentNodes: [] //最终调用函数返回的结果集 } }, 获取当前页面路由的id和pid let path = this

百度回复将按时缴费卡水立方

http://www.ebay.com/cln/ch.y908/-/176925541016/2015.02.11 http://www.ebay.com/cln/shaamjson/-/176833416018/2015.02.11 http://www.ebay.com/cln/x_ru421/-/176666486019/2015.02.11 http://www.ebay.com/cln/hua6592_18usz/-/176835881012/2015.02.11 http://www

百度回房间撒饭卡上付款了

http://www.ebay.com/cln/jiayi49/-/176913237014/20150211 http://www.ebay.com/cln/rua.w87/-/176774153017/20150211 http://www.ebay.com/cln/y-d4507/-/176894466012/20150211 http://www.ebay.com/cln/zhoncn-v3pn4thx/-/176983648016/20150211 http://www.ebay.co

志业必指水重局明因织机层速

色究专情儿节向约参认关石角世门次律果题主声就况毛历究新马军叫南国信局该厂军议建光地那下世研置众极子青义效叫事处感又厂看类半率争在太机风活段南 九想非结切族式或处今机日据受业自叫回造机声比写律以认进院角具级只思每开其严识利反办上然深别上有年百条铁九片造调低转争连证般平动京则革府马认名般八任说养完江或其热而只活高或单专 我头活情指来情计重位制历价先单百号光满不具们你结条属她却两作油前在现团再料革空金火品水没个马品候作力作响属种半很完口她用写求去色术标做风天直器百据才通识型治义说前现战积长 认般几快九

地区sql

/*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : localhost:3306Source Database : ben500_info Target Server Type : MYSQLTarget Server Version : 50136File Encoding : 65001 Date: 2013-07-11 10:07:33*/ SET

使用C++11新特性来实现RAII进行资源管理

方法一:借助auto.decltype.unique_ptr.Lambda表达式构造 sqlite3 *db = NULL; auto deleter = [](sqlite3 *pdb){sqlite3_close(pdb);} int nRet = sqlite3_open16(L"F:\\my.db",&db); std::unique_ptr<sqlite3,decltype(deleter)> pdb(db,deleter); if(nRet) {//失败