资源管理 条款13:以对象管理资源

2020-09-30  本文已影响0人  robotai

总结:

为防止资源泄露,使用RAII对象管理资源,在构造函数中,获取资源,在析构函数中释放资源;

常用RAII class  std::auto_ptr (复制时,指向的资源让渡后指向NULL)  std::tr1::shared_ptr;

知识细节记录:

1、不使用对象管理获得的资源,存在释放失败获得的资源的风险

void f()

{

        Investment* pInv = createInvestment( ); //调用工厂函数

        ...

        delete pInv;     //因前面的语句意外退出,可能执行不到这句。

}

2、把资源放进对象内,可依赖C++的析构函数自动调用机制来确保资源被释放;

3、智能指针可以作为资源管理对象。

std::auto_ptr<Investment> pInv(createInvestment( ));

4、RAII定义

5、管理对象运用析构函数确保资源被shif。

6、auto_ptr 复制后,资源让渡

std::auto_ptr<Investment> pInv1(createInvestment( ));  //pInv1 指向资源

std::auto_ptr<Investment> pInv2(pInv1);   //现在 pInv2 指向资源,pInv1指向NULL

pInv1 = pInv2;    //现在 pInv1 指向资源,pInv2指向NULL

7、auto_ptr 不适合需要复制行为的资源的使用,比如STL容器。

8、RCSP  引用计数智慧指针,支持复制  tr1::shared_ptr.

9、auto_ptr 、tr1::shared_ptr 析构函数内做的是delete 不是 delet[]动作,不适合动态分配的资源管理,

比如 new int[10]

上一篇下一篇

猜你喜欢

热点阅读