Effective C++ 3.资源管理
//条款13:以对象管理资源
// 1.C++程序中最常使用的资源就是动态分配内存,并且还包括文件描述器,互斥锁,GDI对象、数据库连接、网络socket等。不管哪一种资源,当不再使用的时候必须将其归还给系统。
// 2.诸如以下代码:
void fun(int *p)
{
...
...
delete p;
}//以上代码中,p是指向动态分配的内存,在此函数中对p进行使用和释放,但是在函数中可能有一个过早的return语句导致delete语句不能被执行,或者产生一个异常而导致delete语句不能被执行
// 3.当然,谨慎的编写程序可以避免上述错误,但是必须考虑到,代码可能在时间渐渐过去后被修改,一旦软件开始接受维护,可能会被添加欠缺考虑的return等语句而导致delete不能被正常执行
// 4.为了确保上述函数中指针p所指的对象能被正确释放,正确的做法可以是将指针p放入一个对象内,该对象的析构函数会自动释放那些资源。
// 5.利用智能指针可以方便的实现利用对象来管理动态内存资源。经过测试,由于智能指针析构复杂,当需要考虑效率的时候,不如将资源放入一个简单的自定义类中进行管理。
// 6.对于其他资源,可以建立一个资源类,在析构函数中进行资源的释放。 //条款14:在资源类中小心复制行为(利用另一个对象初始化或者用其赋值)
// 1.禁止复制。如同类unique_ptr那样,比如一个资源类包含了互斥锁,那么这个类就应该禁止复制。通过将一系列的拷贝操作声明为private并且不进行定义来实现禁止复制。
// 2.引用计数法。如同类shared_ptr那样,将一直有资源,直到它的最后一个使用者被销毁。实际上使用shared_ptr类并传入自己的删除器可以很方便的实现对资源进行引用计数法管理。
// 3.复制底部资源。有时候需要针对一份资源,需要拥有其任意数量的副本,此时进行对资源的深拷贝。
// 4.转移底部资源。将资源从一个拥有者转移给另一个拥有者。即移动的概念。当对unique_ptr进行std::move的时候就是这种情况。 //条款15:在资源类中提供对原始资源的直接访问
// 1.存在很多函数需要访问原始资源,所以每个资源类都应该提供对原始资源直接访问的方法
// 2.智能指针对->和*进行了重载,它们允许隐式转换至底部原始指针。
unique_ptr<string> pStr(new string("szn"));
int size = pStr->size(); //size = 3
// 3.智能指针的get()成员函数也可以直接获取智能指针所管理的原始资源。 //条款16:成对使用new和delete时要采取相同的形式。
// 1.使用new[]分配内存的时候,会有多个构造函数被调用,当不慎使用delete删除new[]分配的内存时,对应的析构函数的调用次数会出错。
// 2.当使用typedef的时候特别要小心 //17.以独立的语句将new出来的对象放入智能指针中
// 1.考虑如下语句:
fun(shared_ptr<int>(new int), fun1());
// 由于函数形参的调用时机不同,上述函数的调用方式可能是这样的:首先执行new int,然后执行fun1(),最后执行shared_ptr的构造函数,当在fun1()中产生异常,则将导致内存泄露。
// 2.避免上述问题的方法很简单:
shared_ptr<int> pInt(new int);
fun(pInt, fun1());
Effective C++ 3.资源管理的更多相关文章
- 《Effective C++》资源管理:条款13-条款17
条款13:以对象管理资源 为了防止资源泄漏,请使用RAII(Resource Acquisition Is Initialization)对象,在构造函数里面获得资源,在析构函数里面释放资源 auto ...
- 【Effective C++】资源管理
资源:动态分配的内存.文件描述器.互斥锁.图形界面中的字型与笔刷.数据库连接以及网络sockets等,无论哪一种资源,重要的是,当你不再使用它时,必须将它还给系统. 条款13:以对象管理资源 当我们向 ...
- Effective C++: 03资源管理
所谓资源,就是一旦用了它,将来必须还给系统.C++中的资源有:内存.文件描述符.互斥锁.数据库连接.网络socket等. 13:以对象管理资源 1:像下面这个函数: void f() { Invest ...
- effective c++:资源管理
对象管理资源 createInvestment 函数作用时创建一个invest对象: void f() { Investment *pInv = createInvestment(); // call ...
- Effective C++(15) 在资源管理类中提供对原始资源的访问
问题聚焦: 资源管理类是为了对抗资源泄露. 如果一些函数需要访问原始资源,资源管理类应该怎么做呢? 关于资源管理的概念总是显得那么的高大上,其实只是抽象一点. 下面用 ...
- Effective C++(14) 在资源管理类中小心copying行为
问题聚焦: 上一条款所告诉我们的智能指针,只适合与在堆中的资源,而并非所有资源都是在堆中的. 这时候,我们可能需要建立自己的资源管理类,那么建立自己的资源管理类时,需要注意什么呢?. ...
- 《Effective C++》第3章 资源管理(2)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- 《Effective C++》第3章 资源管理(1)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- Effective C++笔记:资源管理
资源:动态分配的内存.文件描述器.互斥锁.图形界面中的字型与笔刷.数据库连接以及网络sockets等,无论哪一种资源,重要的是,当你不再使用它时,必须将它还给系统. 条款13:以对象管理资源 当我们向 ...
随机推荐
- 1、C到C++安全性增强
1.C语言 #include <stdio.h> int main(void) { const int a = 10; //在C语言里这里不赋值可以编译的过去,但是这里不初始化以后就没办法 ...
- DML以及DQL的使用方法
DML:数据操作语言 1.插入insert into 单行插入:insert into 表名 (字段名, 字段名,...) values (值, 值, ...) 注:值列表要和字段列表相匹配. ins ...
- 【转】CodeIgniter定义自己的Helper和Helper的方法
最近做程序,采用了PHP+CodeIgniter框架,总体来说这框架很轻而且上手也很快的. 首先,说下如何定义自己的Helper,个人理解helper其实就是定义函数方法. 如果要建个全新的自己的He ...
- Eclipse反编译插件JadEclipse 【转】
JAVA的反编译插件JadEclipse,官网地址为:http://java.decompiler.free.fr/ 这里面有3个,Jad-Gui大家都知道是一个单独的可执行程序,把要反编绎的jar直 ...
- openCV中IplImage的使用
http://blog.csdn.net/welcome_xu/article/details/7650680 IplImage结构详细分析 IplImage 结构解读: typedef stru ...
- Solr4.3之检索建议suggest
原文链接:http://www.656463.com/article/Efm26v.htm 很多才学solr的人,都容易把solr spellcheck和solr suggest混淆,误以为他们是一样 ...
- UNION 查询中的排序
MSSQL 不允许在UNION查询中使用 ORDER BY 因此,当我们需要这种功能的时候,就需要绕一些弯路. 比如有一张学生表student 和教师表 teacher , 我们要查询所有的教师学生的 ...
- js合计
Js合计行: 可以先循环行,然后按行获取这行带有你定义的class的td,取得这些td的 text后相加,最终赋值到这行的“合计”单元格就行了 var trslength = $("#dat ...
- node express 学习1
参考链接https://cnodejs.org/topic/55ece31004e2cdb230671c50 express-session connect-nongo mongoose 1.安装mo ...
- SSH原理与运用(二):远程操作与端口转发
SSH原理与运用(二):远程操作与端口转发 作者:阮一峰 (Image credit: Tony Narlock) 七.远程操作 SSH不仅可以用于远程主机登录,还可以直接在远程主机上执行操作. 上一 ...