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

来源:互联网 发布:个人淘宝信誉怎么提升 编辑:程序博客网 时间:2024/04/30 06:12

我们经常在开发过程中,在局部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\n", getpid());        }        else        {            fprintf(thePidFile, "%d\n", 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

阅读全文
1 0
原创粉丝点击