读书笔记 Effective C++: 03 资源管理
条款13:以对象管理资源
1. 为防止资源泄露,使用RAII对象。在构造函数中获得资源,在析构函数中释放资源。
2. 常常需要在RAII classes中使用boost::shared_ptr,使copy行为比较直观。
条款14:在资源管理类中小心copying行为
1. 复制RAII对象必须一并复制其所管理的资源。
2. RAII class copying行为是:禁止复制,shared_ptr, 深拷贝,转移资源的拥有权。
条款15:在资源管理类中提供对原始资源的访问
1. APIs往往要求访问原始资源。对原始资源的访问可能经由显示转换或隐式转换,显示转换比较安全,隐式转换对客户比较方便。
显示转换,通过get()函数获取裸指针:
boost::shared_ptr<Investment> pi(new Investment);
Investment* p = pi.get();
隐式转换,隐式转换与操作符重载不一样:
class Font{
public:
operator FontResouce*() const{
return p;
}
FontResouce* get() const{
return p;
}
private:
FontResouce* p;
};
条款16:成对使用new和delete时要采取相同的形式
new和delete配对,new[]和delete[]配对。
条款17:以独立语句将new出来的对象置入智能指针
函数接口:
void processWidget(boost::shared_ptr<Widget> pw, int priority);
调用方式:
boost::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());
而不要用以下方式:
processWidget(boost::shared_ptr<Widget>(new Widget), priority());
这是因为:调用之前编译器必须创建代码,完成以下三件事:1. 调用priority(); 2. 执行new Widget; 3. 调用boost::shared_ptr<Widget>构造函数;编译器对一条语句用重新排列的自由,但是对跨越语句的操作却没有重新排列的自由。因此,C++编译器可能会123,213,231的次序完成上述的3件事,编译器只保证次序23,但是何时执行1,就看编译器的优化了。如果执行的次序是213,但是在执行1的过程抛出异常,导致过程3没有执行,就可能引发资源泄露。
浙公网安备 33010602011771号