【C++基础之九】单例模式

原创 2013年09月17日 11:49:43

1.作用

单例模式目的就是为了保证一个类只有一个实例。


2.原理

(1)私有静态指针变量实现:使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例。

(2)静态局部变量实现:在公有静方法中定义指向该类的一个静态局部变量,并返回该静态局部变量。


3.实现

3.1.私有静态指针变量实现

3.1.1.特点

A.它有唯一一个私有的、指向类的的静态成员指针m_pInstance。

B.它有一个公有的暴露该单例的静态方法getInstance。

C.构造函数是私有的,避免从其他地方创建该类实例。

D.定义单例类中私有内嵌类CGarbo,在其析构函数中释放单例指针。

E.定义CGarbo类的一个实例作为静态成员变量,利用程序结束系统会自动析构所有全局变量的特性来自动释放单例指针。

3.1.2.示例

//Singleton1.h
#pragma once

class CSingleton1
{
public:

	static CSingleton1* getInstance()
	{
		if ( m_pInstance == NULL )
			m_pInstance = new CSingleton1();
		return m_pInstance;
	}

private:

	CSingleton1();

	static CSingleton1* m_pInstance;

	class CGarbo//唯一的作用就是在析构时删除m_pInstance
	{
	public:
		~CGarbo()
		{
			if (CSingleton1::m_pInstance!=NULL)
			{
				delete CSingleton1::m_pInstance;
			}
		}
	};

	static CGarbo m_garbo;//程序结束,系统会自动调用其析构函数

};
//Singleton1.cpp
#include "StdAfx.h"
#include "Singleton1.h"

CSingleton1* CSingleton1::m_pInstance=NULL;//静态成员变量的定义
CSingleton1::CGarbo CSingleton1::m_garbo;//内嵌类静态成员变量的定义

CSingleton1::CSingleton1()
{

}

3.1.3.内存泄漏检测

通过vld进行检测内存泄漏,当未添加CGarbo类,内存泄漏一个字节,即该空单例类实例所占的1个字节,如下。添加CGarbo类及静态成员变量后,内存无泄漏。

Visual Leak Detector Version 2.3 installed.
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x003AC038: 1 bytes ----------
  Call Stack:
    d:\microsoft visual studio 9.0\projects\testcpp\testsingleton\singleton1.h (11): TestSingleton.exe!CSingleton1::getInstance + 0x7 bytes
    d:\microsoft visual studio 9.0\projects\testcpp\testsingleton\testsingleton.cpp (12): TestSingleton.exe!wmain
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (583): TestSingleton.exe!__tmainCRTStartup + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (403): TestSingleton.exe!wmainCRTStartup
    0x7C81776F (File and line number not available): kernel32.dll!RegisterWaitForInputIdle + 0x49 bytes
  Data:
    CD  

3.2.静态局部变量实现

3.2.1.特点

A.无需考虑内存释放问题。

B.禁用类拷贝和类赋值。

3.2.2.示例

//Singleton2.h
#pragma once

class CSingleton2
{
public:

	static CSingleton2& getInstance()
	{
		static CSingleton2 instance;
		return instance;
	}

private:

	CSingleton2();
	CSingleton2(const CSingleton2 &);
	CSingleton2 & operator = (const CSingleton2 &); 

};

3.2.3.无内存泄漏相关问题



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

c\c++复习基础要点08--c++单例模式

单例模式有许多种实现方法,在c++中,甚至可以直接用一个全局变量做到这一点,但是这样的代码显得不优雅。使用全局对象能够保证方便地访问实例,但是不能保证只声明一个对象——也就是说除了一个全局实例外,仍然...

【基础】C++设计模式之单例模式

【声明】 原文链接:http://www.jellythink.com/archives/82#prettyPhoto 【正文】 问题描述 现在,不管开发一个多大的系统(至少我现在的部门是...

c++ 单例模式源码

  • 2011-08-17 09:20
  • 571B
  • 下载

c++线程安全单例模式

黑马程序员——Java基础---单例模式

——- android培训、java培训、期待与您交流! ——–多线程中 有两种单利模式: * 饿汉式 * 懒汉式1、概念、种类、特点概念 java中单例模式是一种常见的设计模式,单例模式确保某...
  • mu_se
  • mu_se
  • 2015-06-07 00:29
  • 246

C++单例模式

C++中的单例模式

  • 2012-12-29 11:48
  • 51KB
  • 下载

黑马程序员---OC基础补充---补充:copy与mutableCopy、单例模式

黑马程序员---OC基础补充---补充:copy与mutableCopy、单例模式

C++单例模式示例代码

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)