Resource Management #
13.Use objects tomanage resources #
- 获得资源后立刻放进管理对象,RAII(Resource Acquisition Is Initialization资源获取时机便是初始化时机)
- 管理对象运用析构函数确保资源被释放
- auto_ptr和tr1::shared_ptr两者都在其析构函数内做delete而不是delete[]动作,vector和string几乎总是可以取代动态分配而得的数组,可以使用boost::scoped_array和boost::shared_array类
14.Think carefully about copying behavior in resource-managing classes #
-
如果复制动作对RAII class 并不合理,考虑禁止复制
-
复制RAII对象必须一并复制它所管理的资源,常见的RAII class copying行为是:抑制copying,施行引用计数法
15.Provide access to raw resources in resource-managing classes #
-
APIs往往要求访问原始资源,所以每个RAII class应该提供一个取得其所管理之资源的办法
-
通常通过调用abort结束程序,来阻止异常从析构函数传播出去
class Font{
public:
explicit Font(FontHandle fh):f(fh)
{}
~Font()
{
releaseFont(f);
}
operator FontHandle() const;//隐式转换函数
{
return f;
}
private:
FontHandle f;
}
16.Use the same form in corresponding uses of new and delete #
-
new表达式中使用[],必须相应的delete表达式中了使用[]
-
不要对数组形式做typeddef动作
typedef std::string AddressLines[4];//不建议
std::string* pal = new AddressLines;
delete pal;//未定义的行为
17.Store newed objects in smart pointers in standalone statements #
在单独语句内以智能指针存储newd所得对象
int priority();
void processWidget(std::shared_ptr<Widget> pw,int priority);
//调用方式1,不推荐
processWidget(std::shared_ptr<Widget> pw(new Widget),priority());
//调用方式2
std::shared_ptr<Widget> pw(new Widget);//在单独语句内以智能指针存储newd所得对象
processWidget(pw,priority());