Вам не нужно ручное управление памятью для синглтона.Вот ваш пример с std::unique_ptr
:
#include <memory>
#include <mutex>
class Singleton
{
static std::unique_ptr<Singleton> singletonInstance;
Singleton() {}
static std::mutex m_;
public:
static Singleton* getSingletonInstance()
{
std::lock_guard<std::mutex> lock(m_);
if (!singletonInstance)
{
singletonInstance = std::make_unique<Singleton>();
}
return singletonInstance.get();
}
};
Деструктор std::unique_ptr
будет вызван, когда процесс завершится нормально.Кроме того, нет необходимости синхронизировать деструктор.
Но даже лучше, вы должны использовать синглтон Скотта Мейера:
class Singleton {
public:
static Singleton& getSingletonInstance() {
static Singleton instance;
return &instance;
}
};
Пример выше является поточно-ориентированным, даже если не используется явная блокировка.
Для вас Q3, хотя функция-член getSingletonInstance
может быть поточно-ориентированной, использование синглтона может и не быть.Общее изменяемое состояние по своей сути небезопасно.