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

单例中的指针释放有关问题

2014-01-03 
单例中的指针释放问题#include iostreamtemplateclass Tclass Singleton//单例模式{protected:///不能

单例中的指针释放问题


#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(),怎么返回原来的对象?(这时创建新对象那还是单例吗?)

热点排行