Общие указатели на синглтон не узнают друг друга

В настоящее время я учусь использовать умные указатели C ++ 11 при программировании движка 2D-игр в качестве хобби с использованием SDL. Однако я столкнулся с проблемой при реализации оболочки OOp для SDL.

Намерение заключается в создании одноэлементного класса, который инициализирует SDL при его создании и отключает SDL при его разрушении. У синглтон-класса есть статический методgetInstance который возвращаетshared_ptr к синглтону и создает единственный экземпляр, если экземпляр не существует, идея состоит в том, что все клиенты синглтона имеютshared_ptr к нему, и когда все клиенты уничтожаются, синглтон также уничтожается. Я понимаю, что синглтоны (и другие глобальные переменные), как правило, плохие, но я думаю, что это может быть одним из немногих случаев, когда уместен синглтон, поскольку может использоваться только одна библиотека SDL.

Проблема заключается в возвращенииshared_ptr изgetInstance метод. Вместо того, чтобы использовать тот жеshared_ptr менеджер объекта,shared_ptr экземпляры не связаны, и уничтожение одного из них освобождает синглтон.

#include <iostream>
#include <memory>
using namespace std;

class Foo
{
public:
    ~Foo(){cout << "Foo <" << this << "> destroyed\n"; instance_ = nullptr;}
    static shared_ptr<Foo> getInstance()
    {
        if(instance_ == nullptr)
            instance_ = new Foo;
        //problem: the shared pointers created are unaware of each other
        return shared_ptr<Foo>(instance_);
    }
private:
    Foo(){cout << "Foo <" << this << "> constructed\n";}
    Foo(Foo& other){}
    void operator=(Foo& other){}
    static Foo* instance_;
};

Foo* Foo::instance_ = nullptr;

int main()
{
    shared_ptr<Foo> a = Foo::getInstance();
    shared_ptr<Foo> b = Foo::getInstance();
    shared_ptr<Foo> c = Foo::getInstance();
}

Выход:

Foo <0x3e2a10> constructed
Foo <0x3e2a10> destroyed
Foo <0x3e2a10> destroyed
Foo <0x3e2a10> destroyed

Ответы на вопрос(2)

Ваш ответ на вопрос