首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于类中静态指针的释放有关问题

2012-09-03 
关于类中静态指针的释放问题先上代码C/C++ codeclass TESTA{public:static TESTA * GetInstance()~TESTA(

关于类中静态指针的释放问题
先上代码

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;}
[解决办法]
探讨
其实不用释放也没关系.
要释放可以在程序退出前释放.
或者不用 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 不就解决问题了?
[解决办法]
探讨
引用:
其实不用释放也没关系.
要释放可以在程序退出前释放.
或者不用 new 的.

C/C++ code

TESTA * TESTA::GetInstance()
{
static TESTA m_Instance ;
return &amp;m_Instance;
}

见到的单例里最简单的实现。。

热点排行