我目前正在学习如何使用 C++11 智能指针,同时使用 SDL 将 2D 游戏引擎作为一种爱好进行编程。但是,我在为 SDL 实现 OOp 包装器时遇到了问题。
目的是创建一个单例类,它在构造时初始化 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