Domanda
Presto pubblicherò un articolo su il mio blog, ma prima vorrei verificare di non aver perso nulla.
Trova un esempio che mi è sfuggito e ti citerò nel mio post.
L'argomento riguarda le implementazioni Singleton non riuscite:In quali casi puoi accidentalmente ottenere più istanze di un singleton?
Finora, ho escogitato:
- Race Condition alla prima chiamata a
instance()
- Incorporazione in più DLL o DLL ed eseguibili
- Definizione del modello di un singleton: classi effettivamente separate
Ci sono altri modi che mi mancano, forse con l'ereditarietà?
Soluzione
Se utilizzi un campo di istanza statica che inizializzi nel tuo file cpp, puoi ottenere più istanze (e un comportamento anche peggiore) se l'inizializzazione di alcuni statici/globali tenta di ottenere un'istanza del tuo singleton.Questo perché l'ordine di inizializzazione statica tra le unità di compilazione non è definito.
Altri suggerimenti
L'ereditarietà non dovrebbe essere un problema finché il ctor è privato.
Tuttavia, se non disabiliti il costruttore di copia, gli utenti potrebbero copiare [non] intenzionalmente l'istanza singleton.Eredita privatamente da boost::non copiabile è il modo più semplice per evitarlo.