>

redis c ++ 클라이언트 를 사용하여 CRUD 작업을 수행하는 클라이언트 API를 개발 중입니다. 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 의 경우를 처리  포인터.

<시간>

I'm getting almost all the suggestions about using shared-pointer/unique-pointer. While I check the examples available online and see how it fits my scenario(custom destructor), I would also like to know if there's anything fundamentally wrong in my method of handling the memory above.

<시간>
  • 답변 # 1

    제안대로, 나는 std::unique_ptr 를 사용했습니다  그것을 구성하는 동안 나는 freeReplyObject 를 호출하는 functor를 전달해야했습니다.  그 안에 기능.

    struct redisReplyDeleterFunctor {
          void operator()(redisReply* p) {
              freeReplyObject(p);
          }
      };
    unique_ptr<redisReply, redisReplyDeleterFunctor> reply((redisReply*)(redisClusterCommand(getDbContext(),  command.c_str())));
    
    

    이제 freeReplyObject() 에 전화 할 필요가 없습니다.  수동으로 메모리를 내 unique_ptr 하자마자 자동으로 해제됩니다  범위를 벗어납니다.

  • 이전 javascript - UI 라우터를 사용하여 객체를 상태로 전달하는 방법은 무엇입니까?
  • 다음 haskell - 접기를 사용한 문자열 순서