Написание класса безопасной оболочки для управления памятью указателя пользовательского объекта - PullRequest
3 голосов
/ 25 апреля 2019

Я использую клиент Redis C ++ для разработки клиентских API, которые будут выполнять операции CRUD в кластере Redis. Используемая мной клиентская библиотека возвращает указатель структуры 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 Ответ

2 голосов
/ 25 апреля 2019

Как и предполагалось, я использовал 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 выйдет из области видимости.

...