三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket等. 1.        以对象管理资源       void f() {     investment *plv = createInvestment();     //这里存在很多不定因素,可能造成下面语句无法执行,这就存在资源泄露的可能.     delete plv; }      这里我们…
为防止资源泄漏,请使用RAII(Resource Acquisiton Is Initialization) 对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII classes 分别是tr1::shared_ptr和auto_ptr.前者通常是较佳选择,因为其copy行为比较直观.若选择auto_ptr,复制动作会使它(被复制物)指向null.…
NOTE: 1.为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源. 2.两个常被使用的RAII classes 分别是 trl::shared_ptr 和 auto_ptr.前者通常是较佳选择,因为其copy行为比较直观.若选择auto_ptr, 复制动作会使它(被复制物) 指向NULL. 没看懂!!!…
如果我们使用一个投资行为的程序库: #include "stdafx.h" #include <iostream> #include <memory> using namespace std; class Investment { public: }; class InvestmentFactory { public: virtual Investment* createInvestment() { Investment * inV = NULL; return…
问题聚焦:     上一条款所告诉我们的智能指针,只适合与在堆中的资源,而并非所有资源都是在堆中的.     这时候,我们可能需要建立自己的资源管理类,那么建立自己的资源管理类时,需要注意什么呢?. 在详述这一章的主题之前,先回忆一下上一节所提到的一个名词——RAII(Resource Acquisition Is Initialization) 含义就是:资源取得时机便是初始化时机. 如果上一节对这个观念的理解还不是很深的话,那么下面这个例子可以让你更好地理解. Demo 假设我们使用C AP…
第一节 <背景> 条款13中讲到“资源取得的时机便是初始化时机”并由此引出“以对象管理资源”的概念.通常情况下使用std中的auto_ptr(智能指针)和tr1::shared_ptr(引数智能指针)作为管理资源的对象.事实上,这种管理方法十分有效.但是,auto_ptr和tr1::shared_ptr只能管理基于堆(heap-based)的资源,而非heap-based的资源却往往不适合.因此,有的时候你需要建立自己的资源管理类.本文介绍的内容是在你建立自己的资源管理类时应该注意的事项. 第…
1.为什么要使用资源管理类? 资源管理类的思路就是,栈上的对象,封装堆上分配的资源,确保一定会释放资源.auto_ptr和shared_ptr就是资源管理类,行为上像指针. 2.auto_ptr和shared_ptr用来管理,堆上分配的内存,在auto_ptr和shared_ptr的析构方法中,执行delete.对于其他资源,auto_ptr和shared_ptr并不适合作为资源管理类.考虑互斥锁mutex,有普通方法lock和unlock,提供一个资源管理类Lock,管理mutex.资源管理类…
C++相比Java等含有gc的语言来说,内存管理方面(也包括资源管理)比较令人头疼.一些初级程序员,甚至是一些经验丰富的老程序员,也会经常在资源管理上犯错.这时候就需要一个能够自动管理资源的东西(gc),但是由于C++本身没有提供,那么只有我们自己实现了. 本节我不打算直接按照<Effective C++>本节的内容进行写作,而是手动实现一个智能指针(想想还有些小激动呢^_^). 首先,我们先编写一个测试代码(先写测试代码总是一个好习惯): //test.h #pragma once #inc…
请牢记: 1.复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为. 2.普遍常见的RAII class copying行为是:抑制copying.施行引用计数法.不过其他行为也可能被实现. auto_ptr和tr1::shared_ptr的观念表现在heap_based资源上.然而并非所有资源都是heap_based,对于非heap_based资源而言,需要建立自己的资源管理类. 假设我们使用C API函数出来类型为Mutex的互斥器对象…
场景 上一节实现了智能指针,其中的拷贝构造函数和赋值运算符是通过增加/减少指针的引用计数来操作的.但是如果是管理一个独占资源呢?我们希望在一个资源使用时被锁定,在使用完毕后被释放. #include <mutex> #include <thread> #include <iostream> using namespace std; mutex mu; int rc=5; void thread1(){ //mu.lock(); rc+=5; cout<<&q…