EasyDarwin开源流媒体服务器中一种实现对作用域内new对象自动释放的方法(值得借鉴)
我们经常在开发过程中,在局部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对象被遗忘的问题;
获取更多信息
Copyright © EasyDarwin.org 2012-2017
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术