Effective C++读书笔记---资源管理

所谓资源就是,一旦用了它,将来必须还给系统。如果不这样,槽糕的事情就会发生。C++程序中最常用的资源就是动态分配内存,还包括文件描述器(file descriptors)、互斥锁(mutex locks)、图形界面中的字形和笔刷、数据库连接、以及网络sockets。不论哪种,当你不再使用时,必须将它还给系统
十三、条款13-以对象管理资源
1.为防止资源泄漏,请使用RAII(“以对象管理资源”的观念常被称为“资源取得时机便是初始化时机”[Resource Acquisition Is Initialization;RAII]),它们在构造函数中获得资源并在析构函数中释放资源
2.两个常被使用的RAII classes分别是tr1::shared_ptr和auto_ptr。前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向NULL
3.auto_ptr和tr1::shared_ptr两者都在其析构函数内做delete而不是delete[]动作。那意味着动态分配而得的array身上使用auto_ptr或tr1::shared_ptr是个馊主意。不过可以了解boost::scoped_array和boost::shared_array classes
十四、条款14-在资源管理类中小心copying行为
1.对于非heap-based的资源而言,像auto_ptr和tr1::shared_ptr这样的智能指针往往不适合作为资源掌管者(resource handlers)
2.当一个RAII被复制,会发生什么事?常见的RAII class copying 行为:
[1]禁止复制
[2]对底层资源祭出“引用计数法”(reference-count)
[3]复制底部资源
[4]转移底部资源的拥有权
十五、条款15-在资源管理类中提供对原始资源的访问
1.APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法
2.可以显示(如get())或隐式(operator raw_resource_class_name() const )进行转换,一般显式比较安全,但隐式对客户又比较方便
十六、条款16-成对使用new和delete时要采用相同形式
1.如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]
十七、条款17-以独立语句将newed对象置入智能指针
1.以独立语句将newed对象置入智能指针。如果不这样,一旦异常被抛出,有可能导致难以察觉得资源泄漏
不要使用
callFun( std::tr1::shared_ptr<TestClass>(new TestClass), otherFun() );
因为编译器可能选择的执行顺位是 new TestClass-->otherFun()-->tr1::shared_ptr构造函数,因为编译器觉得这样的选择可能可以生成更高效的代码,谁知道呢?
但如果otherFun()调用导致异常,会怎么样呢?
所以使用分离语句
std::tr1::shared_ptr<TestClass> pT(new TextClass );
callFun( pT, otherFun() );
这样就不会因为otherFun()可能抛出异常而导致资源泄漏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章