Effective C++ 条款15、16、17

条款15 在资源管理类中提供对原始资源的访问

需要一个函数将RAII class对象(例:tr1::shared_ptr)转换为其所含之原始资源(此处为底部的Investment*)。可有两个做法达成目标:显式转换和隐式转换

显式转换:

shared_ptr<Investment> pInv(createInvestment);
int daysHeld(const Investment* pi);//返回投资天数
int days = daysHeld(pInv);//通不过编译,因为实参不是Investment类型
int days = daysHeld(pInv.get());//正确,通过成员函数get()获取原始资源的访问
shared_ptr和auto_ptr重载了指针取值操作符(operator*和operator->)
class Investment {
public:
	bool isTaxFree()const;
};
Investment* createInvestment();
shared_ptr<Investment> pi1(createInvestment());
bool taxablel = !(pi1->ixTaxFree());
//类同auto_ptr

隐式转换举例:

FontHandle getFont();
void releaseFont(FontHandle fh);
void changeFontSize(FontHandle f, int newSize);
class Font {
public:
	explicit Font(FontHandle fh):f(fh){}
	operator FontHandle()const { return f;}//隐式转换函数
	                                       //也可以写成FontHandle operator()const{return f;}
	~Font() { releaseFont(f); }
private:
	FontHandle f;
};

Font f(getFont());
int newFontSize;
...
changeFontSize(f, newFontSize);//将Font隐式转换为FontHandle

APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理的资源”的办法。

对原始资源的访问可能经由显式转换或隐式转换。一般而言显式转换比较安全,但隐式转换对客户比较方便。

条款16 成对使用new和delete时要采取相同形式

该游戏规则很简单:如果调用new时使用[],必须在对应调用delete时也使用[]。如果调用new时没有使用[],那一定不该在对应调用delete时使用[]。

条款17 以独立语句将newed对象置入智能指针

此条款是为了保证不发生资源泄漏,此处举一实例更好说明问题。

如:

int priority();
void processWidget(shared_ptr<Widget> pw, int priority);
processWidget(shared_ptr<Widget>(new Widget), priority());  ------*

调用processWidget之前,编译器必须创建代码,做以下三件事:

i、调用priority                          或   i、执行“new Widget”

ii、执行“new Widget”           或  ii、调用priority 

iii、调用shared_ptr构造函数      或  iii、调用shared_ptr构造函数

如果在执行*式代码时,调用priority发生异常,此时可能属上面左边情况,new Widget返回的指针将会遗失从而发生资源泄漏。于是正确的做法:

shared_ptr<Widget> pw(new Widget);//在单独语句内以智能指针存储newed所得对象
processWidget(pw, priority());//此时调用动作绝不至于造成内存泄漏

以上内容均来自Scott Meyers大师所著Effective C++ version3,如有错误地方,欢迎指正!相互学习,促进!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值