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

Writing a safe wrapper class for memory management of a user-defined object's pointer

本文关键字:定义 对象 指针 用户 管理 安全 包装类      更新时间:2023-10-16

我正在使用 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指针的情况。


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


正如建议的那样,我使用了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超出范围,内存就会自动释放。