全局和静态对象的清理

类别:编程语言 点击:0 评论:0 推荐:

全局和静态对象的清理

一般地,我们会把全局和静态类对象通过singleton模式实现,其实现方法的记载是汗牛充栋了,常见的一种简便写法是:

class COEApp

         {

         public:

                   static COEApp*  instance ()

        {

                   if (_instance == NULL)///简单一点的double check.

                   {

                            if (_instance == NULL)

                            {

                                     _instance = new COEApp;

                            }

                   }

                   return _instance;

             }

         protected:

                  COEApp (){}

                  (virtual) ~COEApp (){}

         private:

   COEApp (const COEApp&);

                   const COEApp& operator = (const COEApp&);///既然是全局对象,那么拷贝构造函数和赋值函数应该是用不着了,如果有人还要定义singleton对象的友元函数、友类或只是单纯的继承等,这里能起到一点点健壮代码的作用。

                   static COEApp* _instance;

};

如上所例,我们申请了一片内存,但没见到显式或隐式的清理它。一般的某些系统及平台上,程序退出来后,系统会自动清理它,但并非全部,并且在嵌入式系统中并不有这种好运。本文主要说的是在程序退出后,对其进行清理的方法。

第一种方法是利用atexit函数,注册要作的清除操作,因为atexit的内部实现,只能最多有32个注册操作,另外,如果你还带着回忆恐龙时代的怀旧情结使用着某种我听都没听说过的系统,碰巧它上面还不干不这个活,你也许可以考虑自己买点小刀,拿着硬盘,挑着灯花,给它刻上这个实现的二进制代码。

第二种方法,我们可以实现得稍微优雅一点点。基本上都是利用c++标准所保证的一点,栈上的rewind功能。MFC中的宏和一些简单性模板用得很多,露出一副很有技巧的样子。我们也可写出这样的代码,然后装着鄙视比尔.盖茨的样子:

#define RegisterService(classname, servicename) \

         CXServiceObject<classname> xclass##classname##servicename(servicename)      

        

         template<typename T>

                   class CXServiceObject

         {

         public:

                  CXServiceObject(T* inst):_inst(inst){}

                  ~CXServiceObject(){if (_inst)delete _inst;}

         private:

                   T* _inst;

                  CXServiceObject(const CXServiceObject&);

                   const CXServiceObject& operator = (const CXServiceObject&);

         };

在我们实现singleton对象的那个实现文件中,我们加上一句如这样的就可以:RegisterService(COEApp, theOEApp); 我在头文件和实现文件中是定义了extern COEEvent*  theOEEvent; COEApp* theOEApp = COEApp::instance();方便使用。哦,对了,你还可以把所有singleton对象放在同一个文件中,然后这样一列列下来,感觉就像自己做了一个蛋糕一样,心情是大不同吧,:),不过这样的作法在现实中可能比较小,但就给你赶上了。有人嫌其丑陋,应该写成RegisterService( theOEApp) 就好,但我们并没有实现所谓很神秘的MFC六大技术之一的动态识别,那就别着工卡上班吧。

第三种方法,就是一个组合的技巧了,你可以用另一个类来包装上面的类,其内部有一个list或vector中,内部数据类型为其指针型,然后再在上面操盘就可以了。真所谓是一切尽在我掌握中啊掌握中,:)。组合得更为精妙一点的,你可以看看ACE中的现实。

古人云:以其昏昏,使人昭昭。我说的是低层次的东东,如果对你有更高一点的触发,那我也会变得高尚一点,在你心里,:)。

本文地址:http://com.8s8s.com/it/it28985.htm