C++友缘类friend在自动释放模板单例中的使用

编程入门 行业动态 更新时间:2024-10-26 00:30:19

C++友缘类friend在自动释放<a href=https://www.elefans.com/category/jswz/34/1770549.html style=模板单例中的使用"/>

C++友缘类friend在自动释放模板单例中的使用

以下为实现代码:


#pragma region 自动释放模板单例
template<typename T>
class CSingletonFree;
template<typename T>
class CSingleton
{
public:static T*GetInstance(){if (m_pInstance == nullptr){unique_lock<mutex> lg(m_mtx);if (m_pInstance == nullptr){m_pInstance = new T;//cout << "创建单列" << endl;m_AutoFree.Instance = &m_pInstance;}}return m_pInstance;}protected:CSingleton(){}virtual~CSingleton(){//cout << "释放单列" << endl;}
private:static T*m_pInstance;static mutex m_mtx;static CSingletonFree<T> m_AutoFree;CSingleton(const CSingleton&) {};CSingleton& operator=(const CSingleton&) {};
};template<typename T>
T*CSingleton<T>::m_pInstance = nullptr;
template<typename T>
mutex CSingleton<T>::m_mtx;
template<typename T>
CSingletonFree<T> CSingleton<T>::m_AutoFree;
//自动释放
template<typename T>
class CSingletonFree
{
public:T * * Instance = nullptr;~CSingletonFree(){//cout << "自动释放" << endl;if (Instance){if (*Instance){delete *Instance;*Instance = nullptr;}Instance = nullptr;}//cout << "释放结束" << endl;}
};
#pragma endregion

以下为使用案例:


//单列使用例子
class ExampleSingleton :public CSingleton<ExampleSingleton>
{
public:int *Num;~ExampleSingleton(){//cout << "释放ExampleSingleton" << endl;//释放代码if (Num){delete Num;Num = nullptr;}};
private:ExampleSingleton() {};//防止外部创建friend class CSingleton<ExampleSingleton>;};

调用时请注意:


int main()
{ExampleSingleton* instance = ExampleSingleton::GetInstance();instance->Num = new int(2333);cout << *(instance->Num) << endl;//delete instance;//有自动释放这样写会报错的哦CON_PAUSEreturn 0;
}

转载请说明出处!

更多推荐

C++友缘类friend在自动释放模板单例中的使用

本文发布于:2024-03-05 14:31:10,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1712550.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模板   友缘类   friend   单例中

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!