EasyDarwin开源流媒体服务器中一种实现对作用域内new对象自动释放的方法(值得借鉴)
2017-05-29 17:32
686 查看
我们经常在开发过程中,在局部new了一个对象,我们就会在复杂的逻辑过程中担心这个对象是否已经被释放,需要在一大堆的if、else、while、break进行判断new对象是否还存在,或者相同的delete代码会出现一个函数方法的很多位置,就像奶爸带娃一样,处处都需要小心谨慎,而且一旦要看管的对象比较多的时候,那就比较头疼了,容易忘记或者出错;
而在EasyDarwin中,有一个对象大家可以参考,这个就是OSArrayObjectDeleter
从上述代码中不难理解,OSArrayObjectDeleter的作用就是传入对象指针,并在OSArrayObjectDeleter析构函数中调用delete删除传入指针所对应的对象,比如在以下调用中:
参考上述代码,再也不用担心在什么位置调用delete了,超出了theDeleter的作用域,自然就会调用到delete [] tmp;
这种方法已经成功应用于EasyDarwin的很多模块中,例如在EasyRedisModule中Redis操作中的Reply处理:
自动实现了对redisReply对象的释放,而不用再担心复杂的redis数据库操作过程中,new的redisReply对象被遗忘的问题;
WEB:www.EasyDarwin.org
Copyright © EasyDarwin.org 2012-2017
而在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.orgWEB:www.EasyDarwin.org
Copyright © EasyDarwin.org 2012-2017
相关文章推荐
- EasyDarwin开源流媒体服务器中一种实现对作用域内new对象自动释放的方法(值得借鉴)
- EasyDarwin开源流媒体服务器性能瓶颈分析及优化方案设计
- 基于EasyDarwin框架实现EasyNVR H5无插件直播流媒体服务器方案
- 基于EasyDarwin框架实现EasyNVR H5无插件直播流媒体服务器方案
- EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案
- EasyDarwin开源流媒体server将select改为epoll的方法
- easyDarwin--开源流媒体实现
- EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案
- 开源流媒体客户端EasyClient手机端控制摄像机EasyCamera云台PTZ控制实现
- Objective-C的自动释放池(autoreleasepool)、静态方法快速创建对象
- 抽象类实现接口,可以不实现方法。/Object对象可以被强转/自动装箱和自动脱箱
- 单例模式-Singleton Pattern 确保对象的唯一性——单例模式 (四):一种更好的单例实现方法(静态内部类)
- 一种无new创建对象的方法
- 创建两个对象的两种方法,一中\new,另外一种不new
- pjsip实现的软电话连接IPX3500服务器,通话1分钟后自动挂断的解决方法
- 开源流媒体客户端EasyClient手机端控制摄像机EasyCamera云台PTZ控制实现
- AutoStitch一种新的高维图像自动拼接方法AutoStitch: a new dimension in automatic image stitching
- python类中显示重写__del__方法引起循环引用的对象无法释放,一种循环引用的检测方法
- EasyDarwin开源流媒体服务器如何实现按需推送直播的
- 用expect实现ssh自动登录服务器并进行批量管理的实现方法