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 的異常 雖然可...