首页 > 编程语言 >C++ 单例模式

C++ 单例模式

时间:2024-01-26 16:55:54浏览次数:26  
标签:pInstance Singleton nullptr 模式 static C++ 单例 指针

单例模式写法:
注意:静态成员使用指针的话,程序退出时无法指针类的析构函数, 在类内添加回收单例的类,析构的时候将该单例对象析构, 就可以了
例如:
class Singleton
{
public:
static Singleton *getInstance()
{
if ( m_pInstance == nullptr ) // 静态成员使用指针的话,程序退出时无法指针类的析构函数, 会造成内存泄漏
{
m_pInstance = new LoggerMng();
}
return m_pInstance;
}

Singleton::~LoggerMng()
{
// 执行不到
std::cout << __PRETTY_FUNCTION__ << std::endl;
}

private:
static Singleton *m_pInstance;
};

Singleton *Singleton::m_pInstance = nullptr;

改进1:
在单例类种创建回收对象, 该成员在析构时自动删除单例对象
class Singleton
{
public:
...
// 单例回收对象, 该成员在析构时自动删除单例对象
class GarbageCollector
{
public:
~GarbageCollector()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
if ( m_pInstance )
{
delete m_pInstance;
m_pInstance = nullptr;
}
}
};

static GarbageCollector gc;

private:
static Singleton *m_pInstance;
};

Singleton::GarbageCollector gc;

改进2:
单例中构造静态局部成员变量, 但是要返回引用, 不然每次调用都会构造一个新的类
class Singleton
{
public:
Singleton &getInstance()
{
static Singleton instance;
return instance;
}
}

改进3:
使用智能指针, 让智能指针自动释放对象指针; 调用时,要使用智能指针对象中的裸指针
class Singleton
{
public:
static unique_ptr<Singleton> &getInstance()
{
if ( m_ptrInstance == nullptr )
{
m_ptrInstance.reset(new Singleton());
}
return m_ptrInstance;
}

private:
static unique_ptr<Singleton> m_pInstance;
};

unique_ptr<Singleton> Singleton::m_ptrInstance(nullptr);

标签:pInstance,Singleton,nullptr,模式,static,C++,单例,指针
From: https://www.cnblogs.com/weijian168/p/17989738

相关文章

  • C转C++速成浅入浅出系列——STL之queue
    本系列为应付考研复试用,知识浅入浅出,很多地方不深究细节原理;如有谬误,欢迎大家指出。queue【queue:队伍,队列】(学过数据结构的熟的不能再熟了吧)理解为队列。特点是①先入先出②只能对队伍的队首进行出队操作,对队伍的队尾进行入队操作。需提供头文件#include<queue>由于队列的......
  • C转C++速成浅入浅出系列——STL之stack
    本系列为应付考研复试用,知识浅入浅出,很多地方不深究细节原理;如有谬误,欢迎大家指出。stack【stack:栈】(学过数据结构的熟的不能再熟了吧)理解为栈。特点是①先入后出②只能操作栈顶元素需提供头文件#include<stack>由于栈的特性,只能对栈顶元素进行操作,故不可使用.begin()方法......
  • 无涯教程-Scala - 模式匹配
    在函数值和闭包之后,模式匹配是Scala第二广泛使用的函数,Scala在处理消息时为模式匹配提供了强大的支持。Pattern-示例objectDemo{defmain(args:Array[String]){println(matchTest(3))}defmatchTest(x:Int):String=xmatch{case1=>......
  • 设计模式-工厂模式
    前言工厂模式,顾名思义就是我们可以通过一个指定的“工厂”获得需要的“产品”,在设计模式中主要用于抽象对象的创建过程,让用户可以指定自己想要的对象而不必关心对象的实例化过程,这样做的好处是:用户只需通过固定的接口而不是直接去调用类的实例化方法来获得一个对象的实例隐藏......
  • 在Linux Ubuntu系统中部署C++环境与Visual Studio Code软件
      本文介绍在LinuxUbuntu操作系统下,配置VisualStudioCode软件与C++代码开发环境的方法。  在文章VMware虚拟机部署LinuxUbuntu系统的方法中,我们介绍了LinuxUbuntu操作系统的下载、安装方法;本文则基于前述基础,继续介绍在LinuxUbuntu操作系统中配置VisualStudioCode软......
  • 【C++入门到精通】C++入门 —— list (STL)
    @TOC前言文章绑定了VS平台下std::list的源码,大家可以下载了解一下......
  • 关闭VSCode的信任模式
    VSCode的信任模式,每打开一个信任工作区外的文件的时候,会一直弹窗,很烦。关闭VisualStudioCode的信任模式打开设置界面找到"安全性:工作区"选项,然后找到下面的"Trust:Enable"(或者直接在搜索栏搜索"security.workspace.trust"),然后将勾去掉,然后重新打开VSCode。......
  • C++类的继承
    类的继承的概念及定义继承的概念类的继承即对类设计层次的复用,可以在保持原有类结构的基础上对类进行进一步拓展,完成类的继承后,原有的类称为基类/父类,继承的类称为派生类/子类如何定义一个继承类定义一个继承类的基本语法如下classPerson{};classStudent:publicPerson{};......
  • 01 | C++关键字const/volatile
    const与volatileconst从字面意思上是表示“常量”。最基础的用法就是定义程序用到的数字、字符串常量,代替宏定义。constintMAX_LEN=1024;conststd::stringNAME="metroid";不过从C++程序的生命周期角度来看的话,const定义的常量和宏定义还是有本质的区别:const定义......
  • STM32CubeMX教程25 PWR 电源管理 - 睡眠、停止和待机模式
    1、准备材料开发板(正点原子stm32f407探索者开发板V2.4)STM32CubeMX软件(Version6.10.0)野火DAP仿真器keilµVision5IDE(MDK-Arm)ST-LINK/V2驱动XCOMV2.6串口助手2、实验目标使用STM32CubeMX软件配置STM32F407开发板的PWR电源管理,并了解STM32的睡眠、停止和待机模式3、实验......