随笔分类 -  Effective C++(三)——资源管理

摘要:请牢记:以独立语句将newed对象存储于(置入)智能指针内。如果不这样做,一旦异常被跑出来,有可能导致难以察觉的资源泄露。假设有个函数用来处理程序的优先权,另一个函数用来在某动态分配所得的Widget上进行某些带有优先权的处理:int priority(); //处理程序优先权的函数void processWidget(std::tr1::shared_ptr pw, int priority);//该函数在动态分配所得的Widget上进行某些带有优先权的处理。调用:processWidget(new Widget, priority()); //编译不过!该构造函数是expli... 阅读全文
posted @ 2013-12-14 17:12 陌上归人 阅读(382) 评论(0) 推荐(0)
摘要:请牢记:如果在new表达式中使用[],必须在相应的delete表达式中也使用[]。 new[] 对应 delete[]如歌在new表达式中不适用[],一定不要在相应的delete表达式中使用[]。 new 对应 delete当使用new时(即通过new动态生成一个对象),有两件事发生:第一,内存被分配出来(通过名为operator new 的函数);第二,针对此内存会有一个(或更多)构造函数被调用。当使用delete时,也有两件事发生:针对此内存会有一个(或更多)析构函数被调用,然后内存才被释放(通过名为operator delete 的函数)。delete的最大问题在于:即将被删除的内存之内 阅读全文
posted @ 2013-12-13 01:49 陌上归人 阅读(380) 评论(0) 推荐(0)
摘要:请牢记:1、APIs往往要求访问原始资源,所以每一个RAII class应该提供一个“取得其所管理之资源”的办法。2、对原始资源的访问可能经由显式转换或隐式转换。一般而言显式转换比较安全,但隐式转换对客户比较方便。前面条款13的例子中使用了智能指针如auto_ptr或tr1::shared_ptr保存createInvestment的调用结果:std::tr1::shared_ptr pInv(createInvestment()); 假如某个API希望以某个函数处理Investment对象,返回投资天数,如下:int dayHeld(const Investment* pi); //返回投. 阅读全文
posted @ 2013-12-13 01:17 陌上归人 阅读(298) 评论(0) 推荐(0)
摘要:请牢记:1、复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。2、普遍常见的RAII class copying行为是:抑制copying、施行引用计数法。不过其他行为也可能被实现。auto_ptr和tr1::shared_ptr的观念表现在heap_based资源上。然而并非所有资源都是heap_based,对于非heap_based资源而言,需要建立自己的资源管理类。假设我们使用C API函数出来类型为Mutex的互斥器对象(mutex objects),共有lock和unlock两个函数。void lock(Mutex* pm) 阅读全文
posted @ 2013-12-13 00:41 陌上归人 阅读(344) 评论(0) 推荐(0)
摘要:所谓资源就是,一旦使用了它,将来必须还给系统。C++最常使用的资源就是动态分配内存(如果分配了内存却不释放,会导致内存泄露),但内存只是必须要管理的众多资源之一。其他常见的资源还包括文件描述器(file descriptors)、互斥锁(mutex locks)、图形界面中的字型和笔刷、数据库连接、以及网络sockets。不论哪一种资源,重要的是,当不再使用它时,必须将它还给系统。假设我们使用一个用来模拟投资行为(例如股票、债券等)的程序库,其中各式各样的投资类型继承自一个root class Investment:class Investment{ ... //"投资类型" 阅读全文
posted @ 2013-12-12 23:35 陌上归人 阅读(320) 评论(0) 推荐(0)