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出來的對象
使用刪除器。