Нужно ли уничтожать экземпляр синглтона в моем случае? - PullRequest
0 голосов
/ 18 февраля 2019

Если процесс завершается после того, как я использую экземпляр singleton, как показано ниже.Существует ли утечка памяти?

  1. Если да, как я могу решить проблему?
  2. Нужно ли добавить функцию-член destroyInstance?
  3. Еслида, если многопоточность уже ссылается на экземпляр singleton, как я могу обеспечить многопоточную безопасность?(Нужно ли мне добавлять счетчик ссылок?)

Интересно, что если мне нужно рассмотреть все из них, шаблон синглтона кажется очень сложным.

#include <mutex>

class Singleton 
{
    static Singleton *singletonInstance;
    Singleton() {}
    static std::mutex m_;

  public:

    static Singleton* getSingletonInstance()
    {
        std::lock_guard<std::mutex> lock(m_);
        if(singletonInstance == nullptr)
        {
            singletonInstance = new Singleton();
        }
        return singletonInstance;
    }
}

1 Ответ

0 голосов
/ 18 февраля 2019

Вам не нужно ручное управление памятью для синглтона.Вот ваш пример с 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 может быть поточно-ориентированной, использование синглтона может и не быть.Общее изменяемое состояние по своей сути небезопасно.

...