动态

详情 返回 返回

智能指針 - 动态 详情

1、RAII

利用對象生命週期來控制程序資源。在對象構造時獲取資源,在對象析構時釋放資源。

2、智能指針的原理

RAII特性、像指針一樣去使用。

T&operator*()
{
    return *_ptr;
}
T*operator->()
{
    return _ptr;
}

3、問題

多個智能指針指向同一塊空間,這塊空間會被析構多次。也就是智能指針拷貝有問題。

4、unique_ptr

思想:防拷貝。讓拷貝和賦值為私有且只有聲明;或者直接delete。

5、shared_ptr

(1)思想:每一塊資源都有一個計數器,當它為0時才釋放空間。注意線程安全的問題。

template<class T>
class shared_ptr
{
public:
    shared_ptr(T*ptr = nullptr):_ptr(ptr),_count(new int(1)),_mtx(new mtx){}
    shared_ptr(const shared_ptr<T>& sp):_ptr(sp._ptr),_count(sp._count),_mtx(sp._mtx)
    {
        AddRef();//這塊新的資源的引用+1
    }
    shared_ptr<T>& operator=(const shared_ptr<T>&sp)
    {
        if(_ptr!=sp._ptr)
        {
            Release();//原來的資源count--
            _ptr = sp._ptr;
            _mtx = sp._mtx;
            _count = sp._count;
            AddRef();
        }
        return *this;
    }
    ~shared_ptr()
    {
        Release();
    }
    void Release()
    {
        _mtx->lock();
        bool f = false;
        if(--(*_count) == 0 && _ptr)
        {
            f = true;
            delete _ptr;
            delete _count;
        }
        _mtx->unlock();
        
        if(f)delete _mtx;
    }
    void AddRef()
    {
        _mtx->lock();
        ++(*_count);
        _mtx->unlock();
    }
    T&operator()
    {
        return *_ptr;
    }
    *Toperator->()
    {
        return _ptr;
    }
private:
    T* _ptr;
    int* _count;
    mutex* _mtx;
}

(2)問題:循環引用->內存泄漏

解決方法:weak_ptr

6、weak_ptr

思想:可以用shared_ptr構造,當它們指向資源時不會引起計數。

7、如何用智能指針管理不是new出來的對象

使用刪除器。

Add a new 评论

Some HTML is okay.