单例中的指针释放问题
#include <iostream>
template<class T>
class Singleton//单例模式
{
protected: ///不能单独定义对象
Singleton() {}
virtual ~Singleton() {}
public:
class garbo//
{
public:
~garbo()
{
delete Singleton<T>::ptr;
std::cout<<"+++\n";///TEST
}
};
public:
static T *get()
{
if(ptr==NULL) ptr = new T;
return ptr;
}
protected:
static T *ptr;
static garbo gb;///
};
template<class T>
T* Singleton<T>::ptr=NULL;
template<class T>
typename Singleton<T>::garbo Singleton<T>::gb;
class sig:public Singleton<sig>///
{
friend sig* Singleton<sig>::get();
sig() {}
public:
~sig() {}
void show()const{std::cout<<"TEST\n";}
};
int main()
{
sig::get()->show();
return 0;
}
///Singleton::garbo的析构函数为什么得不到执行???
[解决办法]
因为你从头到位没用到garbo gb,所以作为模板,这东西压根没实例化,也就是说根本没这东西。模板是你用到哪个就实例化那个,你没用到的东西一律不实例化
[解决办法]
这种类型的单例模式,实质上会有内存泄露,虽然不明显,影响也很小,甚至可能没有影响
就是你使用了,一般也不会析构。
因为指针指向的内存是动态分配的,你的指针生存周期是整个程序执行期间,
这个只能在你的代码里,直接释放才行,它是不会动态释放的。
C,C++指针本身,不会自动释放动态分配的内存。
要自动释放内存,就需要把指针封装起来。
如果你的 main函数执行结束,还没有释放指针指向的内存,这就是一个标准的内存泄露。
因为 除非 atexit ,以及外部,静态变量的析构函数外,没有办法在函数main 外部,main函数结束执行释放内存的代码。
除非,整个C库代码,都是你自己写的。
[解决办法]
单例的释放问题比较复杂,带来的麻烦远比好处多,所以一般讲单例都不提释放问题。比如
1. 释放后,如果还有人拥有单例的指针,要继续对它操作肿么办?
2. 释放后,如果有人想getInstance(),怎么返回原来的对象?(这时创建新对象那还是单例吗?)