C++シングルモードオブジェクト解放の問題
1963 ワード
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;
}