兩種智慧型指標 RAII智慧型指標和引用計數智慧型指標

2021-07-07 06:50:47 字數 4186 閱讀 9452

raii的全稱是:resource acquisition is initialization 也就是「資源獲取就是初始化」。就像記憶體分配是在變數初始化的時候分配的;比如,當程式結束時,系統會自動釋放程式所使用的資源;函式傳值時,當函式呼叫結束,該值也將消亡。

#include 

#define safe_delete(ptr) if(nullptr!=ptr)//安全delete

template

class smartptr

smartptr(smartptr& ptr):m_ptr(ptr.release()){}

inline t * release()

smartptr& operator=(smartptr& ptr)

return *this;

}smartptr& operator= (t * ptr)

return *this;

}~smartptr()

inline t * operator->()

inline t & operator*()

inline

void reset(t * ptr=nullptr)

inline t * get()const

private:

t * m_ptr;

};int main()

第二種寫法:

#include 

template

inline

void safedelete(t*& ptr)

}template

class smartptr

smartptr(t * ptr):m_ptr(ptr){}

smartptr(const smartptr& other) = delete;

template

smartptr(const smartptr& other) = delete;

smartptr(smartptr&&other)

~smartptr()

smartptr & operator=(const smartptr& other) = delete;

template

smartptr & operator=(const smartptr&other) = delete;

smartptr & operator=(const smartptr&&other)

}inline t & operator*()

inline t * operator->()

inline

const t & operator*()const

inline

const t * operator->()const

inline t * release()

inline

void reset(t * ptr = nullptr)

inline t * get()

inline

const t * get()const

private:

t * m_ptr;

};struct my ;

int main()

引用計數使用到了**模式的相關知識:參考

#include 

#include

#define safe_delete(ptr) if(ptr!=nullptr)

class refcount

~refcount(){}

unsigned

long addref()

unsigned

long release()

inline

void reset()

private:

unsigned

long m_count;

};template

class smartptr

smartptr(t * ptr):m_ptr(ptr),m_counter(new refcount)

smartptr(const smartptr& ptr)=delete;

smartptr(smartptr&& ptr):m_ptr(ptr.m_ptr),m_counter(ptr.m_counter)

smartptr& operator=(const smartptr& ptr)=delete;

smartptr& operator=(smartptr&& ptr)

m_ptr=ptr.m_ptr;

ptr.m_ptr=nullptr;

m_counter=ptr.m_counter;

ptr.m_counter=nullptr;

return *this;

}smartptr& operator=(t * ptr)

m_ptr=ptr;

m_counter->addref();}}

inline t * get()const

inline t & operator*()

inline t * operator->()

inline

void swap(smartptr& ptr)

inline t * release()

private:

refcount * m_counter;

t * m_ptr;

};int main()

關於interlockedincrement和interlockeddecrement參考:

版本2:

#include 

#include

template

inline

void safedelete(t*& ptr)

}class refcounter

~refcounter() {}

std::size_t refadd()

std::size_t release()

std::size_t getcnt()

void reset()

private:

size_t m_cnt;

};template

class smartptr

smartptr(t * ptr) :m_ptr(ptr), m_counter(new refcounter)

smartptr(const smartptr& other) = delete;

template

smartptr(const smartptr&other) = delete;

smartptr(smartptr&&other) :m_ptr(other.m_ptr),m_counter(other.m_counter)

~smartptr()

}smartptr & operator=(const smartptr& other) = delete;

template

smartptr & operator=(const smartptr& other) = delete;

smartptr & operator=(smartptr&&other)

m_ptr = other.m_ptr;

m_counter = new refcounter;

m_counter->refadd();}}

t * relaese()

m_ptr = nullptr;

m_counter = nullptr;

}void reset(t * ptr = nullptr)

m_ptr = ptr;

m_counter = new refcounter;

m_counter->refadd();

}t & operator*()

const t & operator*()const

t*operator->()

const t*operator->()const

private:

t * m_ptr;

refcounter * m_counter;

};struct my ;

int main()

注:**尚有缺點。

RAII 智慧型指標

智慧型指標是c 中為了實現資源的有效管理而被提出的,我們可以建立它但無須操心它的釋放問題,在引入異常機制的程式裡它是十分有用的,或者說,對於博主這中粗心大意的人來說還是可以偶爾使用的。他可以在一些場合防止記憶體洩漏的問題。但是,智慧型指標也是存在著許多的問題,所以許多的程式設計規範裡告誡我們少使用智...

智慧型指標 強弱智慧型指標

在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...

C 的RAII和智慧型指標小結

raii 資源分配即初始化,利用建構函式和析構函式定義乙個類來完成對資源的分配和釋放 智慧型指標主要用來防止記憶體洩漏,我們來舉個栗子,看看為什麼會有智慧型指標這個東東 例1 對於上面這段程式,由於丟擲異常的時候影響了 的執行流,所以要在異常捕獲之前將p提前釋放 詳見 我的部落格 c 的異常 雖然可...