编写安全的包装器类以管理用户定义的对象的指针

时间:2019-04-25 08:10:12

标签: c++ hiredis

我正在使用redis c++ client开发客户端API,该API将在redis集群上执行CRUD操作。每当执行命令时,我正在使用的客户端库都会返回redisReply结构的指针。稍后,我希望在指针上使用freeReplyObject()函数以释放内存。

为了开发一种更安全的方法,以便无意中不要在无效的指针上使用freeReplyObject(),我正在考虑编写包装类:

class reply_wrapper
{
        public:
                redisReply* p_reply;
                reply_wrapper(redisReply* reply = NULL)
                {
                        p_reply=reply;
                }

                ~reply_wrapper()
                {
                        freeReplyObject(p_reply);
                }
};

每当我要在服务器上执行命令时,我都在考虑构造此类的对象。我认为通过这样做,我不再需要手动释放内存。这种方法在这里正确吗,还有更好的方法吗?

请注意,freeReplyObject()处理null指针的情况。


  

我几乎收到了有关使用的所有建议   共享指针/唯一指针。当我检查可用的示例时   在线,看看它如何适合我的情况(自定义析构函数),我会   也想知道我的方法是否有根本上的错误   处理上面的内存。


1 个答案:

答案 0 :(得分:2)

根据建议,我使用了std::unique_ptr,在构造它时,我必须传递一个函子,该函子在其中调用freeReplyObject函数。

struct redisReplyDeleterFunctor {
      void operator()(redisReply* p) {
          freeReplyObject(p);
      }
  };

unique_ptr<redisReply, redisReplyDeleterFunctor> reply((redisReply*)(redisClusterCommand(getDbContext(),  command.c_str())));

现在,我不需要手动调用freeReplyObject(),并且一旦unique_ptr超出范围,内存就会自动释放。