Singleton-Muster in C mit ordnungsgemäßer Speicherverwaltung
Das Singleton-Muster stellt sicher, dass nur eine Instanz einer Klasse erstellt werden kann. Obwohl es viele Ansätze gibt, besteht eine gängige Praxis darin, einen statischen Zeiger zu verwenden, um die Instanzerstellung und -zerstörung zu verwalten. Es ist jedoch wichtig, die Speicherverwaltungsregeln einzuhalten, um Fehler zu vermeiden.
In diesem Beispiel:
<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>
Das manuelle Freigeben eines Singletons mithilfe des Destruktors ist falsch. Wenn externe Verweise auf die Instanz vorhanden sind, führt ein vorzeitiges Löschen zu Abstürzen.
Wählen Sie stattdessen einen besseren Ansatz:
<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>
Hier wird die statische Instanz automatisch erstellt und zerstört Compiler, der eine ordnungsgemäße Speicherverwaltung gewährleistet. Markieren Sie außerdem den Konstruktor als explizit, um implizite Typkonvertierungen zu verhindern, und machen Sie den Kopierkonstruktor und den Zuweisungsoperator privat, um unerwünschte Objektduplizierungen zu verhindern.
Das obige ist der detaillierte Inhalt vonWie erreicht man eine ordnungsgemäße Speicherverwaltung bei der C-Singleton-Implementierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!