写了个单例模式的模板,为什么Garbo没有析构,该如何解决
写了个单例模式的模板,为什么Garbo没有析构
写了个单例模式的模板,在Garbo析构函数设断点了,发现没有被析构,这是为什么呢?
.h文件:
class CriticalSection
{
public:
CriticalSection() {InitializeCriticalSection(&cs_);}
~CriticalSection() {DeleteCriticalSection(&cs_);}
void Lock() {EnterCriticalSection(&cs_);}
void UnLock() {LeaveCriticalSection(&cs_);}
protected:
CRITICAL_SECTION cs_;
};
template <typename T>
class Singleton
{
public:
static T* GetInstance()
{
if(!m_)
{
cs.Lock();
if(!m_)
m_ = new T();
cs.UnLock();
}
return m_;
}
~Singleton(){}
private:
Singleton(){}
static T* m_;
static CriticalSection cs;
class Garbo
{
public:
~Garbo()
{
if(Singleton<T>::m_){
delete Singleton<T>::m_;
Singleton<T>::m_ = NULL;
}
}
};
static Garbo garbo;
};
.cpp文件:
template<typename T>
T* Singleton<T>::m_ = NULL;
template<typename T>
CriticalSection Singleton<T>::cs;
template<typename T>
typename Singleton<T>::Garbo Singleton<T>::garbo;
// 测试类
class CA{
public:
CA(){std::cout<<"AAAA\n";}
~CA(){
std::cout<<"BBBB\n";
}
void Run(){
for(int k = 0; k < 10; ++k)
std::cout<< k << " ";
}
};
int main()
{
CA *a = Singleton<CA>::GetInstance();
a->Run();
return 0;
}
------解决方案--------------------
template ,一般情况下你没用到的东西编译器生成代码的时候就不会帮你生成
写了个单例模式的模板,在Garbo析构函数设断点了,发现没有被析构,这是为什么呢?
.h文件:
class CriticalSection
{
public:
CriticalSection() {InitializeCriticalSection(&cs_);}
~CriticalSection() {DeleteCriticalSection(&cs_);}
void Lock() {EnterCriticalSection(&cs_);}
void UnLock() {LeaveCriticalSection(&cs_);}
protected:
CRITICAL_SECTION cs_;
};
template <typename T>
class Singleton
{
public:
static T* GetInstance()
{
if(!m_)
{
cs.Lock();
if(!m_)
m_ = new T();
cs.UnLock();
}
return m_;
}
~Singleton(){}
private:
Singleton(){}
static T* m_;
static CriticalSection cs;
class Garbo
{
public:
~Garbo()
{
if(Singleton<T>::m_){
delete Singleton<T>::m_;
Singleton<T>::m_ = NULL;
}
}
};
static Garbo garbo;
};
.cpp文件:
template<typename T>
T* Singleton<T>::m_ = NULL;
template<typename T>
CriticalSection Singleton<T>::cs;
template<typename T>
typename Singleton<T>::Garbo Singleton<T>::garbo;
// 测试类
class CA{
public:
CA(){std::cout<<"AAAA\n";}
~CA(){
std::cout<<"BBBB\n";
}
void Run(){
for(int k = 0; k < 10; ++k)
std::cout<< k << " ";
}
};
int main()
{
CA *a = Singleton<CA>::GetInstance();
a->Run();
return 0;
}
------解决方案--------------------
template ,一般情况下你没用到的东西编译器生成代码的时候就不会帮你生成