3

我正在使用redis c++ 客户端来开发客户端 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指针的大小写。


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


4

1 回答 1

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超出范围,内存就会自动释放。

于 2019-04-25T13:33:58.673 回答