我们经常在开发过程中,在局部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开源流媒体服务器中一种实现对作用域内new对象自动释放的方法(值得借鉴)的更多相关文章

  1. NodeJS版本EasyDarwin开源流媒体服务器开发心得

    title: Node版本EasyDarwin开发心得 date: 2018-03-27 22:46:15 tags: 年后着手Node版本EasyDarwin的开发工作,截止到今天2018年03月2 ...

  2. EasyDarwin开源流媒体服务器Golang版本:拉转推功能之拉流实现方法

    EasyDarwin开源流媒体服务器(www.easydarwin.org),拉转推是一个很有意义的功能,它可将一个独立的RTSP数据源"拉"到服务器,再通过转发协议转发给多个客户 ...

  3. EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路

    背景 近期跟开源团队商量,想在EasyDarwin上继续做一些功能扩展,目前EasyDarwin开源流媒体服务器只能够实现高效的RTSP推流直播转发/分发功能,输入与输出都是RTSP/RTP流,不能够 ...

  4. EasyDarwin开源流媒体服务器将select改为epoll的方法

    本文来自EasyDarwin团队Fantasy(fantasy(at)easydarwin.org) 一. EasyDarwin网络模型介绍 EventContext负责监听所有网络读写事件,Even ...

  5. 解决用EasyDarwin开源流媒体服务器做HLS直播时Flash Player卡住的问题

    最近在开发EasyDarwin开源流媒体服务器HLS直播的时候发现一个现象:在PC上用flash player播放HLS和在ios上面播放HLS时,效果明显不同,在ios上播放非常稳定,而在flash ...

  6. EasyDarwin开源流媒体服务器Golang版本:服务端录像功能发布

    EasyDarwin开源流媒体服务器(www.easydarwin.org)现在使用Go版本实现了.最新的代码提交,已经支持了推流(或者拉流)的同时进行本地存储. 本地存储的原理,是在推流的同时启动f ...

  7. EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案

    本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52400226 EasyDarwin团队的Ba ...

  8. EasyDarwin开源流媒体服务器提供的TS切片/HLS直播打包库

    EasyHLS  Github:https://github.com/EasyDarwin/EasyHLS EasyHLS是什么? EasyHLS是EasyDarwin开源流媒体社区开发的一款HLS打 ...

  9. EasyPusher安卓直播推流到EasyDarwin开源流媒体服务器工程简析

    EasyPusher主要有三部分组件组成:采集,编码,叠加,上传.在这个基础上同时支持本地存储\后台预览的功能.主要业务模块与相关类之间的关系如图所示: Created with Raphaël 2. ...

随机推荐

  1. Appium的Java封装

    文章出处 http://blog.csdn.net/niubitianping/article/details/52612211 一.为什么需要封装? 封装的本意就是为了方便.简洁. 二.Androi ...

  2. bootstrap圆角

    圆角问题 这里为圆角, .;}   原因是我是用li 标签的line-height给他撑开的,所以会出现圆角,所以我没有定义side的background-color加上就好了             ...

  3. day5笔记 列表 list 增删改查

    列表的使用 一.索引和切片 # 索引和切片,用法与字符串一样 l = [1,2,3,'af','re',4,'45'] print(l[0]) print(l[3]) print(l[-1]) # ' ...

  4. Php ArrayIterator的几个常用方法

    搜索商低..从php.net找到 ,自己翻译一下 总结在一起   rewind()    指针回到初始位置 valid()        判断数组当前指针下是否有元素 key()        数组键 ...

  5. java常见异常(更新中)

    Java的异常分为两种,一种是运行时异常(RuntimeException),一种是非运行异常也叫检查式异常(CheckedException) .NullPointerException 空指针异常 ...

  6. iOS日常学习 - App之间常用的五种通信方式及适用场景总结

    本文为转载学习,原文地址 iOS系统是相对封闭的系统,App各自在各自的沙盒(sandbox)中运行,每个App都只能读取iPhone上iOS系统为该应用程序程序创建的文件夹AppData下的内容,不 ...

  7. Sublime Text3 使用记录

    Sublime Text 3 使用记录 来看下本文的大纲吧 介绍下,我的环境      操作系统:win10 64bit      sublime Text  3 版本:3143 那么就开始啦. 一. ...

  8. jsp基础知识点——思维导图

    如图 思维导图图片链接 http://www.edrawsoft.cn/viewer/public/s/0b8cd083478732 有道云笔记图片链接 http://note.youdao.com/ ...

  9. docker之DockerSwarm的了解

    这次一起了解下docker Swarm,什么是dockerSwarm. 什么是docker Swarm 产品背景 使用docker的流程,ssh到一台服务器,运行docker命令来运行本机的docke ...

  10. 使用maven创建项目时报错The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    Description Resource Path Location Type The superclass "javax.servlet.http.HttpServlet" wa ...