C++シングルモードオブジェクト解放の問題


std::mutex resource_mutex;
class MyCAS //         
{
private:
    MyCAS() {}//       

private:
    static MyCAS* m_instance;//      
    

public:
    static MyCAS* getInstance()
    {
        if (m_instance == nullptr)
        {
            std::unique_lock<:mutex> myMutex(resource_mutex);//    
            if (m_instance == nullptr)
            {
                m_instance = new MyCAS();
                static CgarRes cl;  //        , cl           ,       MyCAS::m_instance 
            }
        }
        
        return m_instance;
    }

    class CgarRes   //    ,      
    {
    public:
        ~CgarRes()
        {
            if (MyCAS::m_instance)
            {
                delete MyCAS::m_instance;
                MyCAS::m_instance = nullptr;
            }
        }
    };
    
    void func()
    {
        cout << "test" << endl;
   }


};

//        
MyCAS* MyCAS::m_instance = nullptr;

int main()
{
    MyCAS* p_a = MyCAS::getInstance();
    return 0;
}

実際には、単一のインスタンスのオブジェクトは、オブジェクトが解析されると、コンパイラがインスタンスポインタを自動的に解放します.ここではただ解放できる考えを理解しただけだ.
std::mutex resource_mutexは、マルチスレッドが単一インスタンスにアクセスするために、スレッドがコンテキスト切替を実行すると、セキュリティの問題が発生し、2つのインスタンスオブジェクトが作成される可能性があります.
実はこの点はC++11でもっと面白い解決方法があります.
void call_once (once_flag& flag, Fn&& fn, Args&&...args);
最初のパラメータはstd::once_flagのオブジェクト(once_flagは変更できません.そのコピーコンストラクタとoperator=関数はdeleteとして宣言されます)は、2番目のパラメータがエンティティを呼び出すことができます.つまり、1回のみ実行するコードが要求され、その後の可変パラメータがパラメータリストになります.
これのシェルリファレンス:https://blog.csdn.net/xijiacun/article/details/71023777
例:
static std::once_flag oc;//call_用onceの局所静的変数
        Singleton* Singleton::m_instance;
        Singleton* Singleton::getInstance() {
            std::call_once(oc, [&] () {  m_instance = new MyCAS();                 static CgarRes cl;              });
            return m_instance;
        }