关于类中静态指针的释放问题
先上代码
- C/C++ code
class TESTA{public: static TESTA * GetInstance(); ~TESTA(void);private: TESTA(); static TESTA * m_Instance;};TESTA * TESTA::m_Instance = NULL;TESTA * TESTA::GetInstance(){ if( m_Instance == NULL ) { m_Instance = new TESTA; } return m_Instance;}TESTA::TESTA(){}TESTA::~TESTA( void ){}构造函数是私有的,使用方式是:
TESTA * pt = TESTA::GetInstance();
但这样会有个问题就是如何把new的内存释放掉?我试过在析构函数中调用delete m_Instance;
然后显示的调用的析构函数,但这样会产生异常。
如果delete的话,Visual Leak Detector会提示内存泄露
WARNING: Visual Leak Detector detected memory leaks!
如何释放掉这个静态指针呢?
[解决办法]
不好意思,前面看错了,你有做多次的保护。静态指针释放后,需要等待线程或者是程序结束后,才会由操作系统回收,所以为了避免隐患,最好delete m_Instance之后m_Instance = NULL把指针赋为NULL。
[解决办法]
其实不用释放也没关系.
要释放可以在程序退出前释放.
或者不用 new 的.
- C/C++ code
TESTA * TESTA::GetInstance(){ static TESTA m_Instance ; return &m_Instance;}
[解决办法]
[解决办法]
单例通常不需要delete,其生命周期大致和整个程序的生命周期相同。
你可以参考:
C++实现Singleton模式
如果你不想搞得像上面那么复杂,那么你可以参考:
- C/C++ code
#include <iostream>using namespace std;class TESTA{public: static TESTA * GetInstance(); static void DeleteInstance(); // 增加这行 ~TESTA(void);private: TESTA(); static TESTA * m_Instance;};TESTA * TESTA::m_Instance = NULL;TESTA * TESTA::GetInstance(){ if( m_Instance == NULL ) { m_Instance = new TESTA; } return m_Instance;}void TESTA::DeleteInstance() // 增加实现{ if(m_Instance != NULL) { delete m_Instance; m_Instance = NULL; }}TESTA::TESTA(){ cout << "a singleton constructed." << endl;}TESTA::~TESTA( void ){ cout << "a singleton destructed." << endl;}int main(int argc, char** argv){ TESTA* p1 = TESTA::GetInstance(); cout << (void*)p1 << endl; TESTA* p2 = TESTA::GetInstance(); cout << (void*)p2 << endl; // 可以看到只构造了一次,两次输出的地址是相同的。 TESTA::DeleteInstance(); TESTA* p3 = TESTA::GetInstance(); cout << (void*)p3 << endl; TESTA* p4 = TESTA::GetInstance(); cout << (void*)p4 << endl; return 0;}
[解决办法]
搞个smart point 不就解决问题了?
[解决办法]