具有適當記憶體管理的 C 語言單例模式
單例模式確保只能建立一個類別的一個實例。雖然有許多方法,但常見的做法是使用靜態指標來管理實例的建立和銷毀。但是,遵守記憶體管理規則以防止錯誤至關重要。
在此範例中:
<code class="cpp">class A { static A* m_pA; A(); ~A(); static A* GetInstance(); static void FreeInstance(); void WORK1(); void WORK2(); void WORK3(); }; A* A::GetInstance() { if (m_pA == NULL) m_pA = new A(); return m_pA; } A::~A() { FreeInstance() // Don't write this here } void A::FreeInstance() { delete m_pA; m_pA = NULL; }</code>
使用析構函數手動釋放單例是不正確的。如果存在對實例的外部引用,過早刪除它會導致崩潰。
相反,採用更好的方法:
<code class="cpp">class A { static A* m_pA; explicit A(); void A(const A& a); void A(A &a); const A& operator=(const A& a); ~A(); static A* GetInstance(); static void FreeInstance(); void WORK1(); void WORK2(); void WORK3(); }; A* A::GetInstance() { if (m_pA == NULL){ static A self; m_pA = &self; } return m_pA; } A::~A() { }</code>
這裡,靜態實例是由編譯器,確保正確的記憶體管理。此外,將建構函式標記為明確以防止隱式類型轉換,並將複製建構函式和賦值運算子設為私有以防止不必要的物件重複。
以上是如何在 C 單例實作中實現正確的記憶體管理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!