话说,之前虽然分别看过《大话设计模式》以及《设计模式之禅》,但是对里面的各种设计模式总是处于看过就忘的状态,唯一拿得出手的,也就是个单例模式了,窃以为已经把单例模式用得溜溜的了,然而,面试时,碰到一个问题,尴尬了。
“单利模式如何删除呢?”
好吧,尴尬的问题,尴尬的答案,下面整理一下好了。
第一反应是,会随着程序退出,进而整体释放,也就无所谓删除了,那么问题来了,假如在单例里面,打开了文件需要关闭呢?或者说是占用了资源需要释放呢?而且,无作为本身也不优雅,更别提有可能产生的‘当当当’的退出弹窗了。
既然不理睬不行,那么,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(资源获取即初始化)。