我正在使用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
指针的情况。
我几乎收到了有关使用的所有建议 共享指针/唯一指针。当我检查可用的示例时 在线,看看它如何适合我的情况(自定义析构函数),我会 也想知道我的方法是否有根本上的错误 处理上面的内存。
答案 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
超出范围,内存就会自动释放。