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