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
阅读全文
1 0
- EasyDarwin开源流媒体服务器中一种实现对作用域内new对象自动释放的方法(值得借鉴)
- 开源流媒体服务器--EasyDarwin
- EasyDarwin开源流媒体服务器将select改为epoll的方法
- EasyDarwin开源流媒体服务器如何实现按需推送直播的
- EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路
- EasyDarwin开源流媒体项目
- EasyDarwin开源流媒体服务器内存管理优化
- vs2015编译EasyDarwin开源流媒体服务器Linux版本调研
- [转载]EasyDarwin开源流媒体服务器内存管理优化
- vs2015编译EasyDarwin开源流媒体服务器Linux版本调研
- EasyDarwin开源流媒体服务器Work-stealing优化方案
- EasyDarwin开源流媒体服务器提供的TS切片/HLS直播打包库
- EasyDarwin开源流媒体服务器提供的RTMP直播推送库
- 解决用EasyDarwin开源流媒体服务器做HLS直播时Flash Player卡住的问题
- EasyDarwin开源流媒体社区视频教程
- 开源流媒体服务器
- EasyDarwin开源流媒体服务器gettimeofday性能优化(3000万/秒次优化至8000万次/秒)
- [转载]EasyDarwin开源流媒体服务器gettimeofday性能优化(3000万/秒次优化至8000万次/秒)
- Mybatis5.0.2分页插件
- bmob和okgo的冲突
- javaoop总结
- python3_字典
- hibernate-关系映射(一对一(单向、双向))-8
- EasyDarwin开源流媒体服务器中一种实现对作用域内new对象自动释放的方法(值得借鉴)
- lowlevel_init.S 分析
- IMWeb提升营Day5 | 训练题27:字符串的排列
- L1-009. N个数求和
- MSDN例子 获取网卡、ip等信息
- Android adb命令介绍
- MySQLTuner--使用方法
- Raid 2.0 及重构原理举例
- Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)