Effective C++读书笔记(三) 资源管理

来源:互联网 发布:linux chgrp 单词 编辑:程序博客网 时间:2024/04/20 13:07

3 资源管理

所谓资源就是,一旦用了它,将来必须还给系统。C++程序中最常使用的资源就是动态分配内存(如果你分配内存却从来不曾归还它,会导致内存泄露),但内存只是你必须管理的众多资源之一。

 

条款13:以对象管理资源
            Use object to manage resources.

•    把资源放进对象内,我们便可依赖C++的“析构函数自动调用机制”确保资源被释放。

•    STL标准程序库提供的auto_ptr正是针对这种形式而设计的特制产品。auto_ptr是个“类指针(pointer-like)对象”,也就是“智能指针”,其析构函数自动对其所指对象调用delete。

•    Std::auto_ptr<Investment>pInv(CreateInvesment());

•    获得资源后立刻放进管理对象(managingobject)内。

•    RAII(Resource Acquisition Is Initialization)

•    管理对象(managingobject)运用析构函数确保资源被释放。

•    auto_ptrs copying 动作有破坏性:若通过copy构造函数或copyassignment操作符复制它们,它们会变成NULL,而复制所得的指针将取得资源的唯一拥有权!(多个                  auto_ptr不能同时指向同一对象)

•    auto_ptr的替代方案是“引用计数型智慧指针”(reference-countingsmart pointer;RCSP)。RCSP也是个智能指针,持续追踪共有多少对象指向某笔资源,并在无人指向它时自动删除该资源。TR1的tr1::shared_ptr就是个RCSP,你可以这么写

•    Std::tr1::shared_ptr<Investment>pInv(CreateInvestment());

•    auto_ptr 和shared_ptr 都是在其析构函数上调用delete ,而不是delete []动作。那意味着在动态分配而得的array上使用,是错误的。

•    总结

                –  为防止资源泄露,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。

                –  两个常被使用的RAII classes分别是tr1::shared_ptr auto_ptr

条款14:在资源管理类中小心copying行为

             Think carefully about copying behavior in resource-managing classes.

•    RAII守则:资源在构造期获得,在析构期被释放

•    禁止复制。Copying private   或   继承 Uncopyable

•    引用计数(reference-count)。shared_ptr 允许指定所谓的“删除器”(函数或者函数对象)

•    Deep copying

•    转移底部资源的拥有权

•    总结

             –  复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。

             –  普遍而常见的RAII class copying行为是:抑制copying、施行引用计数法(referencecounting)。不过其他行为也都可能被实现。

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

               Provide access to raw resources in resourece-managing classes

•    所有智能指针,如tr1::shared_ptr和 auto_ptr 也重载了指针取值(pointer dereferencing)操作符(operator->)和(operator*),它们允许隐式转换至底部原始指针;

•    总结

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

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

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

               Use the sameform in corresponding uses of new and delete.

•    当你使用new动态生成一个对象,有两件事发生;

–  内存被分配

–  针对此内存会有一个(或更多)构造函数被调用.

•    当你使用delete,也有两件事发生:

–  针对此内存会有一个(或更多)析构函数被调用.

–  内存被释放

•    尽量不要对数组形式做typedef动作。

•    总结

               –  当你用new生成对象时,如果用new type-object[],则要使用 delete []type-object ,否则使用 delete

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

               Store newedobjects in smart pointers in standalone statements.

•    以独立语句将newed对象存储于(置入)智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露。

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


 

原创粉丝点击