C++单例模式之析构

    话说,之前虽然分别看过《大话设计模式》以及《设计模式之禅》,但是对里面的各种设计模式总是处于看过就忘的状态,唯一拿得出手的,也就是个单例模式了,窃以为已经把单例模式用得溜溜的了,然而,面试时,碰到一个问题,尴尬了。

    “单利模式如何删除呢?”

    好吧,尴尬的问题,尴尬的答案,下面整理一下好了。

    第一反应是,会随着程序退出,进而整体释放,也就无所谓删除了,那么问题来了,假如在单例里面,打开了文件需要关闭呢?或者说是占用了资源需要释放呢?而且,无作为本身也不优雅,更别提有可能产生的‘当当当’的退出弹窗了。

    既然不理睬不行,那么,delete掉呢?

    好吧,几千行的代码中,可能还记得delete,那么上万行呢?十万行呢?要是忘了呢?乱了呢?多次释放呢?

    那么析构吧~像智能指针那样优雅的析构掉……于是就有了下面的更尴尬的代码:

Singleton::~Singleton()
{
	std::cout << "Singleton::~Singleton" << std::endl;
	if (m_Instance)
	{
		std::cout << "delete Singleton Instance" << std::endl;
		delete m_Instance;
		m_Instance = nullptr;
	}
}

    好吧,大神们肯定看出来了,析构里面delete掉自身的静态指针,而delete的过程会调用析构函数,析构继续调用delete....无限循环了!

    唉,脑袋抽搐的代码!

    都知道,像局部变量啦,在超出有效区以后,就会被自动释放掉,这也就是简单的智能指针的使用,还有种说法叫做RAII(资源获取即初始化)。

    类中的变量,其实在退出以后,也是会被自动释放掉的,这样就有了下面这个自动释放的方法

#pragma once

class Singleton
{
public:
	static Singleton* GetInstance();
	~Singleton();

	void func();

private:
	Singleton()  { static CGarbo Garbo; }
	static Singleton* m_Instance;

	class CGarbo
	{
	public:
		~CGarbo() {
			if (Singleton::m_Instance)
			{
				delete Singleton::m_Instance;
				Singleton::m_Instance = nullptr;
			}
		}
	};
	//static CGarbo Garbo;	//--->1
};

    看别人的blog,也有人说,在1的位置,来声明那个私有类变量,但是在调试的时候,因为没有看到具体的调试信息,所以心里总是有些没底,so,还是选择在单例模式初始化里面,声明了一个static变量。


    最后,欢迎拍砖~~~

你可能感兴趣的:(设计模式)