Comment implémenter correctement le pattern Singleton en C++ (approches modernes)
Bonjour, collègues ! J'ai récemment commencé à étudier les patterns de conception et je suis tombé sur le Singleton. Je comprends l'idée : garantir qu'une classe n'a qu'une seule instance et fournir un point d'accès global à celle-ci. Mais en C++, je vois beaucoup d'implémentations différentes et je n'arrive pas à comprendre laquelle est correcte et thread-safe.
Par exemple, j'ai écrit cette version simple :
```cpp
class Singleton {
public:
static Singleton* getInstance() {
if (!instance) {
instance = new Singleton();
}
return instance;
}
void doSomething() { /* ... */ }
private:
Singleton() {}
static Singleton* instance;
};
Singleton* Singleton::instance = nullptr;
```
Mais plusieurs points me gênent :
1. Ce n'est pas thread-safe : si deux threads appellent `getInstance()` en même temps, deux objets peuvent être créés.
2. Faut-il supprimer explicitement l'objet ? Si oui, comment ? Dans le destructeur ? Mais alors qui appellera le destructeur ?
3. Je vois sur Internet des versions avec `std::call_once