资源管理类是对抗资源泄露的堡垒。排除此等泄露是良好设计系统的根本性质。依赖classes来处理和资源之间的所有互动,而不是玷污双手直接处理原始资源。
使用智能指针如auto_ptr或者tr1::shared_ptr保存factory函数如createInvestment的调用结果。
std::tr1::shared_ptr<Investment> pInv(createInvestment());
假设希望以某个函数处理Investment对象,
int daysHeld(const Investment* pi); //返回投资天数
int days=daysHeld(pInv); //错误!
因为daysHeld需要的是Investment* 指针你传给它的却是类型为tr1::shared_ptr<Investment>对象
tr1::shared_ptr和auto_ptr都提供一个get成员函数,用来执行显式转换,会返回智能指针内部的原始指针(的复件)
int days=daysHeld(pInv.get()); //很好,将pInv内的原始指针传给daysHeld
tr1::shared_ptr和auto_ptr也重载了指针取值操作符(operator->和operator*),允许隐式转换底部原始指针:
class Investment{
bool isTaxFree() const;
};
Investment* createInvestment();
std::tr1::shared_ptr<Investment> pil(createInvestment()); //令tr1::shared_ptr管理一笔资源
bool taxable=!(pil->isTaxFree()); //经由operator->访问资源
std::auto_ptr<Investment> pi2(createInvestment()); //令auto_ptr管理一笔资源.
bool taxable2=!((*pi2).isTaxFree()); //经由operator* 访问资源