这个Singleton类有什么问题吗?

Dhi*_*sen -2 c++ singleton implementation static-methods

在这些条件下,我编写了下一个Singleton类:
1 - 我想要一个且只有一个类的实例存在并且可以从整个游戏引擎访问.
2 - Singleton被密集使用(每帧数千次)所以我不想写一个额外的GetInstance()函数,我试图避免任何额外的函数调用性能
3 - 一种可能性是让GetInstance()像内联一样这个 :

inline Singleton* Singleton::GetInstance()
{
  static Singleton * singleton = new Singleton();
  return singleton;
}
Run Code Online (Sandbox Code Playgroud)

但这会引起一个引用问题,每次调用时都会有一个对单例的新引用,用于修复用c ++编写的内容:

class Singleton{
private:
    static   Singleton* singleton;
    Singleton(){}

public:
    static inline  Singleton* GetInstance() // now can be inlined !
    {
        return singleton;
    }

    static void Init()
    {
        // ofc i have to check first if  this function
        // is active only once
        if(singleton != nullptr)
        {
            delete singleton;
        }

        singleton = new Singleton();
    }

    ~Singleton(){} // not virtual because this class can't be inherited
};

Singleton* Singleton::singleton = nullptr;
Run Code Online (Sandbox Code Playgroud)

这个实现可能会遇到什么问题?

Jar*_*d42 11

您的第一个实施问题是new您唯一的泄密.以及强制用户检查指针有效性的签名.

由于您需要使用两步初始化,并且不禁止复制/移动/分配,因此您的第二个实现会出现更多问题.

只需使用迈耶斯的单身人士:

class Singleton{
private:
    Singleton() = default;
    ~Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton operator&(const Singleton&) = delete;

public:
    static Singleton& GetInstance()
    {
        static Singleton instance;
        return instance;
    }
};
Run Code Online (Sandbox Code Playgroud)

  • [flagged]这实际上并没有回答OP关于他的代码可能有什么问题的问题.请解释什么会导致您使用此代码而不是OP编写的内容."它更好"并不是一个充分的答案.请提供为什么它更好.他做了什么不做......等等.谢谢! (2认同)

Gui*_*cot 5

除了@ Jarod42的回答之外,我想指出你也可以通过制作模板来实现一个通用的单例,并在CRTP类中使用它:

template<typename T>
class Singleton {
protected:
    Singleton() = default;
    ~Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton operator&(const Singleton&) = delete;

public:
    static T& instance() {
        static T instance;
        return instance;
    }
};
Run Code Online (Sandbox Code Playgroud)

然后扩展它:

struct MySingleton : Singleton<MySingleton> { /* ... */ };
Run Code Online (Sandbox Code Playgroud)