LINUX.ORG.RU

Вопрос по всеми любимому синглетону

 ,


0

1

Может ли быть разным адрес экземпляр синглетона?
Например когда счеткик ссылок на синглетон обнулился, он уничтожается. Затем кто-то вновь создает инстанс, который заведомо будет в одном экземпляре. Т.е. по сути вопрос, хорошо ли так делать:

struct MySingleton {
  static std::shared_ptr<MySingleton> Instance() {
    if ( !instance_ )
      instance_ = std::shared_ptr<MySingleton>( new MySingleton );
    return instance_;
  }
private:
  static std::shared_ptr<MySingleton> instance_;
};



Последнее исправление: nerdogeek (всего исправлений: 2)

Может ли быть разным адрес экземпляр синглетона?

Может. В конце концов, это твоя программа, а не того, кто написал про синглтон в книжке.

Наверное, вопрос больше не в том, _можно_ ли так делать, а в том, _нужно_ ли убивать этот объект, когда он никому не нужен. Можно, к примеру, просто вернуть какой-нибудь permanent_ptr<MySingleton> с перегруженной стрелкой и ничего не делающим деструктором.

ilammy ★★★
()
Ответ на: комментарий от ilammy

С другой стороны, если кто-нибудь передаст указатель синглета в сишную либу, то фейл почти гарантирован.

nerdogeek
() автор топика
Ответ на: комментарий от nerdogeek

Если он настолько жирный, что два гигабайта адресного пространства надо специально под него расчищать, то это несколько другая проблема. Если синглтон требует каких-то ресурсов (памяти, файлов и т. п.) для своей работы и эти ресурсы ему не нужны, когда он простаивает, — это не повод держать счётчик ссылок на сам синглтон и убивать его, когда он не нужен. Я думаю, в таком случае концептуально правильнее держать ссылки на эти самые ресурсы (ведь это они становятся ненужными, а не синглтон). А синглтон можно создать один раз и пусть себе валяется до смерти программы.

Энивей, если это типа «негибко» то можно обмазаться Александреску и наворотить десяток стратегий на все случаи жизни.

ilammy ★★★
()
Ответ на: комментарий от nerdogeek

просто пиши так:

  static MySingleton& Instance() {
    static MySingleton r;
    return r;
  }

это простой, безопасный и thread-safe (для С++11 и выше) код

wota ★★
()
Ответ на: комментарий от wota

Синглетон Мейрса - это классика. На самом деле всегда так пишу.
Но хочется же поизвращаться, раз уж на плюсах такое дело

nerdogeek
() автор топика
Ответ на: комментарий от wota

Что мешает заменить shared_ptr на weak_ptr для instance_?

Gvidon ★★★★
()
Ответ на: комментарий от nerdogeek

Синглтон Мейерса, на мой взгляд, плохо подходит для случаев, когда синглтону требуется нетривиальная инициализация и деинициализация

Gvidon ★★★★
()

Может ли быть разным адрес экземпляр синглетона?

Может, если API класса предусамтривает механизм уничтожения.

А вообще, не злоупотребляй веще^Wсинглтонами, это по сути те же глобальные переменные, только в блестящем фантике.

annulen ★★★★★
()

Скажи синглтонам нет. Это чистое зло.

nanoolinux ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.