我有一個單例類實現如下。使用模板和調用析構函數的單例
#include <iostream>
using namespace std;
template<class T>
class singleton{
protected:
static T* s_instance;
public:
T* instance(){
if(s_instance){
return s_instance ;
}else{
s_instance = new T;
return s_instance;
}
}
};
template <class T>
T* singleton<T>::s_instance;
class A:public singleton<A>{
friend class singleton;
public:
void print_add(){
cout<<"I AM A"<<endl;
cout<<s_instance<<endl;
}
~A(){
//delete s_instance;
cout<<"Dest A"<<endl;
}
private:
A(){}
};
class B:public singleton<B>{
friend class singleton;
public:
void print_add(){
cout<<"I AM B"<<endl;
cout<<s_instance<<endl;
}
~B(){
cout<<"Dest B"<<endl;
//delete s_instance;
}
private:
B(){}
};
int main(){
A* a, *c;
B* b;
a->instance()->print_add();
b->instance()->print_add();
c->instance()->print_add();
}
如何調用destruct-或爲此。 它看起來像沒有上面的「刪除」行,valgrind顯示0內存泄漏。沒有刪除指針,我泄漏內存?或者實現單例的方法是錯誤的? 對於這兩個類我們有一個共同的靜態成員。基本上這裏的靜態成員對於不同的對象有何不同?
感謝
可否請您告訴我,在多個翻譯單元中,它將如何超過一個實例,而不使用extern關鍵字? – neeru
是的。規則是每個翻譯單元都會創建模板,導致靜態對象的一個實例出現在每個生成的目標文件中。只要所有的目標文件都鏈接到相同的二進制文件中,那麼就不會有問題,因爲鏈接程序會將所有實例合併爲一個實例。但是,如果將目標文件編譯爲不同的二進制文件,則最終將在每個二進制文件中創建不同的實例。這可能會或可能不會被接受,具體取決於代碼的意圖。 –