effective c++ 条款13 use object to manage resources.

请求的系统资源需要最终还回系统,为了避免遗忘返还这个动作,可以利用析构函数在object销毁时自动调用的特点来实现。

简单说就是用object来管理资源。

以内存资源为例

class Investment {}; 

Investment* creatInvestment(){...} // factory function to produce investment object

void main()
{
  Investment* pInv = creatInvestment();//call to get investment object

  ....

  delete pInv;           // sometime we forget this, happens
}

//solution
void main()
{
   stid::auto_ptr<Investment> pInv(creatInvestment());

   ...
}//when pInv is destroied, auto_ptr will be released.

//problem with auto_ptr
//only one auto_ptr can point to one object
//if auto_ptr was assgined to another auto_ptr
//original auto_ptr would be null
//see following example:
void main()
{
   stid::auto_ptr<Investment> pInv1(creatInvestment());

    stid::auto_ptr<Investment> pInv2(pInv1); //pInv1 null

    pInv1 = pInv2;//pInv2 null
   ...
}

所以使用auto_ptr 在赋值或者复制时会产生问题。我们并不希望赋值以后就把原来的指针变成null

替代方案是使用  

void main()
{
   stid::shared_ptr<Investment> pInv1(creatInvestment());

    stid::shared_ptr<Investment> pInv2(pInv1); //pInv1 null

    pInv1 = pInv2;//pInv2 null
   ...
}

在拷贝时完全不会发生问题。需要注意的是在auto_ptr, shared_ptr中使用的是delete 而不是delete[]

如果我们

 stid::shared_ptr<Investment> pInv1(new char[10]);会产生问题。

effective c++ 条款13 use object to manage resources.,布布扣,bubuko.com

时间: 2024-12-13 13:13:23

effective c++ 条款13 use object to manage resources.的相关文章

Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为

三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket等. 1.        以对象管理资源       void f() {     investment *plv = createInvestment();     //这里存在很多不定因素,可能造成下面语句无法执行,这就存在资源泄露的可能.     delete plv; }      这里我们

Effective C++——条款13(第3章)

第3章    资源管理 Resource Management 所谓资源就是,一旦用了它,将来必须还给系统.C++程序中最常使用的资源就是动态内存分配(如果分配内存从来都增归还,会导致内存泄露).其他常见的资源还有文件描述符(file descriptors),互斥锁(mutex locks),图形界面中的字型和笔刷,数据库连接,以及网络sockets.不论哪一种资源,重要的是,不再使用它时,必须将它还给系统. 条款13:    以对象管理资源 Use objects to manage res

More Effective C++ 条款13 以reference方式捕捉exception

1. 由条款12知,如果catch子句捕获异常采用按值传递,那么被抛出的异常要被复制两次,这降低了效率,而且将派生类对象传给基类对象有可能会产生切割问题,但是按值传递也有它的好处,在catch子句重新throw异常的时候,它可以选择throw经catch子句处理过的异常还是原来的异常,这增加了灵活性(throw;) 2. 按指针传递似乎可以避免异常的复制,(虽然指针还是要被复制,不过4字节的代价不高),但是要注意指针指向的不能是局部对象,因为局部对象会被销毁,这就要求指针指向动态分配的内存,但由

Effective C++ -----条款13:以对象管理资源

为防止资源泄漏,请使用RAII(Resource Acquisiton Is Initialization) 对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII classes 分别是tr1::shared_ptr和auto_ptr.前者通常是较佳选择,因为其copy行为比较直观.若选择auto_ptr,复制动作会使它(被复制物)指向null.

Effective C++ 条款13

以对象管理资源 资源的种类很多,动态分配的内存.文件描述器.互斥锁.图像界面中画刷.数据库连接.网络socket等.资源一般是有限的,当你不用时,必须释放.不然就会造成资源浪费,更严重的情况下,非法占有所有资源导致程序崩溃. 那么我们怎么样才能合理使用资源?换句话说我们应该怎么样才能做到资源的释放? 本节的核心点是:利用析构函数自动调用机制实现资源的合理释放. 举个例子: class Investment//基类 { -- }; Investment* CreateInvestment() {

effective c++ 条款13:以对象管理

记住: 为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII类分别是tr1::shared_ptr和auto_ptr.前者通常是较佳选择,因为其copy行为比较直观.若选择auto_ptr,复制动作会使它(被复制物)指向null. class Investment { ... }; Investment* createInvestment(); void f() { Investment* pInv = createInvestment()

《Effective C++ 》学习笔记——条款13

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 三.Resource Management 到了第三张了,这一章主要讲述的就是资源的管理. ①.OK,首先,什么是资源--一旦使用,就必须还给系统的东西.C++程序员最长使用的资源就是动态分配内存(因为如果你分配内存却不曾归还,会导致内存泄露),但显然内存只是你

effective C++ 读书笔记 条款12与条款13

条款12:确定你的public继承塑膜出is-a关系: 这个条款主要将了一些特殊情况:比如企鹅是鸟,企鹅可以继承于鸟,但是鸟会飞,企鹅却不能飞:还有让正方形继承矩形可能也会造成这种尴尬! 这个问题以前想过,但是不知道怎么解决,如果现实生活当中确实要这么使用:比如 猫 狗 鱼  猪等等许多动物继承Animal类,但是猫狗等不会游泳, 假如这里是有很多动物,不能采用鱼里面专门加一个方法!  这个现在还没想出来,条款12也没有讲如果要这么用该怎么处理就是将要避免这样. is - a; 在面向对象程序设

effective c++ 条款3 use const whereever you can

1 const 传达的意思应该是这个变量是常量不能更改 2 const 在 * 左边表示数据是const,在右边表示指针是const // char greeting[] = "hello"; char* p = greeting; //const *: const data //* const: const pointer char const *p1 = greeting; // const data char * const p2 = greeting; // const poi