2015-05-05 2 views
1

Я выбежала Valgrind на мой код, который использует hiredis, он указывает на следующие отдельные строки в моем коде:памяти в hiredis с помощью Valgrind

  • redisAsyncConnect()
  • redisAsyncConnectUnix()
  • redisLibuvAttach ()
  • uv_loop_new()

Я использовал «redisAsyncDisconnect», чтобы освободить память для первых двух случаев, со uldn't найти правильный метод для третьего. Для четвертого я использовал uv_stop(). Но все же valgrind говорит, что есть определенная потеря в памяти во всех четырех, что является правильным способом освободить память?

+0

Я считаю, что вы пробовали 'redisLibuvDetach()'? :) – Eregrith

+0

@ Eregrith для всех трех? –

+0

Нет, как пара для 'redisLibuv * Attach *()' – Eregrith

ответ

1

Просто делать a simple google search показывает метод redisLibuvAttach()just does a simple malloc

static int redisLibuvAttach(redisAsyncContext* ac, uv_loop_t* loop) { 
    redisContext *c = &(ac->c); 

    if (ac->ev.data != NULL) { 
    return REDIS_ERR; 
    } 

    ac->ev.addRead = redisLibuvAddRead; 
    ac->ev.delRead = redisLibuvDelRead; 
    ac->ev.addWrite = redisLibuvAddWrite; 
    ac->ev.delWrite = redisLibuvDelWrite; 
    ac->ev.cleanup = redisLibuvCleanup; 

    redisLibuvEvents* p = (redisLibuvEvents*)malloc(sizeof(*p)); 

    if (!p) { 
    return REDIS_ERR; 
    } 

    m emset(p, 0, sizeof(*p)); 

    if (uv_poll_init(loop, &p->handle, c->fd) != 0) { 
    return REDIS_ERR; 
    } 

    ac->ev.data = p; 
    p->handle.data = p; 
    p->context  = ac; 

    return REDIS_OK; 
} 

Метод on_close в этом файле шоу вы можете просто free(handle->data):

static void on_close(uv_handle_t* handle) { 
    redisLibuvEvents* p = (redisLibuvEvents*)handle->data; 

    free(p); 
} 

или просто убедитесь, что метод называется.

+0

, что у меня есть указатель на redisAsyncContext, используя redisAsyncDisconnect(), дает ошибку сегментации и redisFree() работает но появляется как потерянная память в valgrind. Есть ли функция hiredis для правильного выпуска? –