有没有人用c++实现过单例?
有没有人用c++实现过单例? 我现在必须释放资源(因为未来随着项目的推进可能会在单例中加入大量GDI资源、Socket连接、File句柄等等),地球人都知道析构函数不行。
根据Modern c++ design的指示我使用了atexit注册,也不行,因为class成员是thiscall调用,而atexit是cdecl调用约定,很郁闷的是MCD著作大师戛然而止了(更别提GOF讲的Singleton了,简直是一笔代过),他给的代码明显不能编译通过。于是乎,我只能把释放函数也搞成了static,不让这个类成员它生成可恶的this指针参数!
下面的代码要加上锁解决多线程访问。
把释放函数搞成了static,那么资源也必须是static的,否则无法访问。
现在的问题是: 我把资源都搞成static吗? 这样做会带来哪些不良后果?项目计划把大量的全局量搞成单例。
static成员好像在程序退出时操作系统会做清理的,假如是一个位图句柄或者是打开着的文件句柄等等打开着的资源,不知道操作系统会不会把打开的资源关闭?
项目中打算使用的示例性代码:
- C/C++ code
#include <iostream>#include <cstdlib>using namespace std;// headerclass CGlobalGdiRes{private: static int h1,h2; //在这里声明所有资源,比如位图、字体等。 CGlobalGdiRes(){ h1=1;h1=2; //在这里创建所有资源。 cout<<"CGlobalGdiRes Constructed!"<<endl; }; ~CGlobalGdiRes(){}; static void Release(){ h1=0;h2=0; //在这里释放所有资源。 cout<<"All resources had been released!"<<endl; }; CGlobalGdiRes(const CGlobalGdiRes&){}; CGlobalGdiRes& operator=(const CGlobalGdiRes&){}; static CGlobalGdiRes* pIns;public: static CGlobalGdiRes* GetInstance() { if (!pIns) { if (!pIns) { pIns =new CGlobalGdiRes; atexit(&CGlobalGdiRes::Release); } } return pIns; }protected:};// implementCGlobalGdiRes* CGlobalGdiRes::pIns=0;int CGlobalGdiRes::h1 =0;int CGlobalGdiRes::h2 =0;//driverint main(){ CGlobalGdiRes* p =CGlobalGdiRes::GetInstance(); return 0;}
[解决办法]
程序结束时,windows是会释放所有资源的。
如果你需要单例,那么这个对象一般都是全局存在的了,一些GDI资源如果不是全局需要的,那么就不应该放在一个单例里(不包括你以指针方式存放于单例对象的资源)。
单例有很多种实现方式,不一定是static的,可以在程序启动,还没有允许其他实际功能前,或者在第一次需要使用到单例对象是才创建。
[解决办法]
请楼主google“Meyer's singleton”
[解决办法]
如果类不是设计给别人用,用全局变量也能解决单例问题,
至于释放资源,你给close掉不就是释放资源吗
[解决办法]
程序结束时,系统会回收该程序的所有资源,包括句柄。
[解决办法]
mark,要不你可以再建一个外围类,利用构造和析构;实现类似智能指针的功能就可以了嘛