Effective C++ 3

资源:有用有还。

资源:内存,文件描述器,互斥锁,图形界面中的字形和笔刷,数据库连接,socket

class Investment {}; Investment* createInvestment(); void f() { Investment* pInv = createInvestment(); ... delete pInv; //如果在...中有return或抛出异常就无法删除指针。 } //由此得出必须要自动删除而不是手动删除,因此要建立在对象之中管理资源。 //当然还能有智能指针auto_pte和shared_ptr

因此获得资源后必须放入对象。RAII原则(资源取得就初始化)

在析构函数时运用前一篇文章的方法防止异常。

不能让auto_ptr指向同一个对象。

RCSP(reference-counting smart pointer) 引用计数型智慧指针

但是tr1::shared_ptr无法打破互指而产生的错误“被使用”状态。

智能指针只能做delete 而不能做delete[],但是动态分配数组能够在string和vector中实现。

总之一句话,指针都要放进对象中。

互斥器实例:

void lock(Mutex* pm); void unlock(Mutex* pm); class Lock { public: explicit Lock(Mutex* pm):mutexPtr(pm){lock(mutexPtr);} ~Lock(){unlock(mutexPtr);} private: Mutex* mutexPtr; Lock(const Lock& s); //互斥器可以避免复制构造函数。 Lock& operator=(const Lock& s); };

第二种避免无谓复制方法:

void lock(Mutex* pm); void unlock(Mutex* pm); class Lock { public: explicit Lock(Mutex* pm):mutexPtr(pm,unlock){lock(mutexPtr.get());} //mutex有一个删除器即引用计数为0时执行步骤。 //用get()的原因是提供原始指针。 ~Lock(){unlock(mutexPtr);} private: shared_ptr<Mutex>mutexPtr; Lock(const Lock& s); //互斥器可以避免复制构造函数。 Lock& operator=(const Lock& s); };

auto_ptr和shared_ptr都提供get()函数提供原始指针。

一般来说显式转换比隐式转换好。

RAII的目的是让资源友好的释放。

接下来让我们看看delete和new

当new[]时,即动态分配数组,包括指出了数组大小,以便让delete知道调用多少个。

当然C++标准程序库的出现使得数组的需求降了不小。

shared_ptr<A>pt;

A*a=new A; new A的类型为原始指针类型。而shared_ptr为智能指针类型。

就整理到这里。接下来看4:设计与声明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值