我们经常在开发过程中,在局部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

最新文章

  1. ssh中org.springframework.orm.hibernate4.support.OpenSessionInViewFilter的作用及配置
  2. Linux SSH,FTP服务配置
  3. shell基础
  4. 开源的excel读取库libxls在windows下的编译,且支持中文,全网首发
  5. Python——学习笔记
  6. 调整Tomcat的并发线程到5000+
  7. Knockout 可扩展性
  8. 图片应该放在drawable-hdpi下不要放在drawable下
  9. 第三次C语言作业
  10. 微信公众号 模板消息 定时推送 java
  11. 【编程语言】extern &quot;C&quot;让C++与C进行混合编程
  12. /* * 有五个学生,每个学生有3门课的成绩,从键盘输入以上数据 *(包括学生号,姓名,三门课成绩),计算出平均成绩, *将原有的数据和计算出的平均分数存放在磁盘文件&quot;stud&quot;中。 */
  13. .net 手机滑动加载
  14. 【转】Visual Studio——多字节编码与Unicode码
  15. 一篇关于蓝牙SDP和L2CAP协议的文章
  16. p1211 Prime Cryptarithm
  17. MQTT 3.1.1,值得升级的6个新特性
  18. Docker Dockerfile简述
  19. CSS镂空图片处理
  20. ICG游戏:证明,先手不是必胜就是必败。

热门文章

  1. beego——ORM使用方法
  2. CNN学习笔记:目标函数
  3. Python框架之Tornado(源码之褪去模板外衣的前戏)
  4. SLF4J日志系统在项目导入时频现的问题
  5. 再来一道测半平面交模板题 Poj1279 Art Gallery
  6. Windows 2008下系统网站运行环境的搭建
  7. 使用John the ripper工具来尝试破解Linux密码
  8. 《大型网站系统与JAVA中间件实践》读书笔记-数据访问层
  9. skynet之伪取消定时器
  10. css transform旋转属性