码迷,mamicode.com
首页 > 编程语言 > 详细

【effective c++】资源管理

时间:2016-07-29 21:03:58      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:

以对象管理资源的观念常被称为“资源取得时机便是初始化时机”(RAII)

auto_ptr被销毁时会自动删除它所指之物,所以一定要注意别让多个auto_ptr同时指向同一对象,否则对象会被删除多次,行为未定义

auto_ptr有一个性质:若通过拷贝构造函数或拷贝构造运算符复制它们,它们会变成NULL,而复制所得的指针将取得资源的唯一拥有权

class Investment
{
private:
    double value;
public:
    Investment(double val):value(val){}
    double getValue()
    {
        return value;
    }
};

Investment* createInvestment(double val)
{
    return new Investment(val);
}

int main()
{
    auto_ptr<Investment> pInv1(createInvestment(3.0));
    cout << pInv1->getValue() << endl;
    auto_ptr<Investment>pInv2(pInv1);
    cout << pInv1->getValue() << endl;//出错,pInv1为NULL
}

可以用shared_ptr来代替auto_ptr,shared_ptr有一个缺点:无法打破环状引用,若两个其实已经没被使用的对象彼此互指,就好像还处在被使用的状态

auto_ptr和shared_ptr两者都在其析构函数内做delete而不是delete[]动作,所以在动态分配而得的array身上使用auto_ptr或shared_ptr是个馊主意

总结:

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

2.两个常被使用的RAII classes是shared_ptr和auto_ptr,前者是更好的选择(两者均用于管理heap上资源)


 

class Lock
{
public:
    explicit Lock(mutex* pm) :mutexPtr(pm)
    {
        mutexPtr->lock();
    }
    ~Lock()
    {
        mutexPtr->unlock();
    }
private:
    mutex *mutexPtr;
};
----------------------------------------------------------------------------
//对底层资源采用引用计数
class Lock
{
public:
    explicit Lock(mutex* pm) :mutexPtr(pm,pm->unlock)
    {
        mutexPtr.get()->lock();
    }
private:
    tr1::shared_ptr<mutex> mutexPtr;
};

shared_ptr允许指定删除器(deleter),这是一个函数或函数对象,当引用次数为0时便被调用(此机能并不存在于auto_ptr,它总是将指针删除)


 

【effective c++】资源管理

标签:

原文地址:http://www.cnblogs.com/ljygoodgoodstudydaydayup/p/5719550.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!