【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.无内存泄漏相关问题



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

用iptables实现网页重定向

实现目标: 内网用户,无论其在IE地址栏内输入任何网址,都被系统强制跳转到路由器主页(192.168.1.1) 解决办法: iptables -t nat -A PREROUTING -m mult...
  • umitor
  • umitor
  • 2013年02月28日 18:05
  • 8132

Linux3.5内核对路由子系统的重构对Redirect路由以及neighbour子系统的影响

几年前,我记得写过好几篇关于Linux去除对路由cache支持的文章,路由cache的下课来源于一次对路由子系统的重构,具体原因就不再重复说了,本文将介绍这次重构对Redirect路由以及neighb...
  • dog250
  • dog250
  • 2016年02月27日 13:23
  • 3145

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

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

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

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

Headfirst(五)单例模式C++实现

  • 2015年10月21日 15:24
  • 495KB
  • 下载

C++单例模式示例代码

  • 2015年09月29日 18:21
  • 2KB
  • 下载

java基础知识之单例模式

设计模式:解决某一类问题最行之有效的方法。 java中23种设计模式: 单例设计模式:解决一个类在内存只存在一个对象。 想要保证对象唯一。 1,为了避免其他程序过多建立该类对象。先禁止...

C++ 单例模式

  • 2016年09月28日 20:04
  • 2KB
  • 下载

swift基础之实现单例模式(仿NSUserDefaults)

单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象。 当你只需要一个实例的时候需要使用单例,如UIA...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C++基础之九】单例模式
举报原因:
原因补充:

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