zoukankan      html  css  js  c++  java
  • EasyDarwin开源流媒体服务器中一种实现对作用域内new对象自动释放的方法(值得借鉴)

    我们经常在开发过程中,在局部new了一个对象,我们就会在复杂的逻辑过程中担心这个对象是否已经被释放,需要在一大堆的if、else、while、break进行判断new对象是否还存在,或者相同的delete代码会出现一个函数方法的很多位置,就像奶爸带娃一样,处处都需要小心谨慎,而且一旦要看管的对象比较多的时候,那就比较头疼了,容易忘记或者出错;

    而在EasyDarwin中,有一个对象大家可以参考,这个就是OSArrayObjectDeleter

    template <class T>
    class OSArrayObjectDeleter
    {
        public:
            OSArrayObjectDeleter() : fT(NULL) {}
            OSArrayObjectDeleter(T* victim) : fT(victim)  {}
            ~OSArrayObjectDeleter() { delete [] fT; }
    
            void ClearObject() { fT = NULL; }
    
            void SetObject(T* victim) 
            {
                Assert(fT == NULL);
                fT = victim; 
            }
            T* GetObject() { return fT; }
    
            operator T*() { return fT; }
    
        private:
    
            T* fT;
    };

    从上述代码中不难理解,OSArrayObjectDeleter的作用就是传入对象指针,并在OSArrayObjectDeleter析构函数中调用delete删除传入指针所对应的对象,比如在以下调用中:

    void test(bool forked)
    {
        char* tmp = new char[64];
        OSArrayObjectDeleter theDeleter(tmp);
        if (thePidFile)
        {
            if (!forked)
            {
                fprintf(thePidFile, "%d
    ", getpid());
            }
            else
            {
                fprintf(thePidFile, "%d
    ", getppid());
            }
    }

    参考上述代码,再也不用担心在什么位置调用delete了,超出了theDeleter的作用域,自然就会调用到delete [] tmp

    这种方法已经成功应用于EasyDarwin的很多模块中,例如在EasyRedisModule中Redis操作中的Reply处理:

    class RedisReplyObjectDeleter
    {
        public:
            RedisReplyObjectDeleter() : fReply(NULL) {}
            explicit RedisReplyObjectDeleter(redisReply* reply) : fReply(reply)  {}
            ~RedisReplyObjectDeleter() 
            { 
                if (fReply)
                {
                    freeReplyObject(fReply);
                }
            }
    
            void ClearObject() { fReply = NULL; }
    
            void SetObject(redisReply* reply) 
            {
                fReply = reply; 
            }
            redisReply* GetObject() const { return fReply; }
    
        private:
    
            redisReply* fReply;
    };

    自动实现了对redisReply对象的释放,而不用再担心复杂的redis数据库操作过程中,new的redisReply对象被遗忘的问题;

    获取更多信息

    邮件:support@easydarwin.org

    WEB:www.EasyDarwin.org

    Copyright © EasyDarwin.org 2012-2017

    EasyDarwin

  • 相关阅读:
    学习篇之String()
    js之Math对象
    js之date()对象
    css之描点定位方式
    js详解之作用域-实例
    js精要之构造函数
    js精要之继承
    js精要之模块模式
    js精要之对象属性
    js精要之函数
  • 原文地址:https://www.cnblogs.com/babosa/p/9217831.html
Copyright © 2011-2022 走看看