C 使用valgrind的hiredis内存泄漏

C 使用valgrind的hiredis内存泄漏,c,memory-leaks,redis,hiredis,C,Memory Leaks,Redis,Hiredis,我在使用hiredis的代码上运行了valgrind,它指出了代码中的以下各行: redisAsyncConnect() redisAsyncConnectUnix() redisLibuvAttach() uv_loop_new() 在前两种情况下,我使用了“redisAsyncDisconnect”来释放内存,但在第三种情况下找不到正确的方法。对于第四个,我使用了uv_stop()。但是valgrind仍然说,这四种方法中肯定都有内存丢失,释放内存的正确方法是什么?只要这样做,就会显示出

我在使用hiredis的代码上运行了valgrind,它指出了代码中的以下各行:

  • redisAsyncConnect()
  • redisAsyncConnectUnix()
  • redisLibuvAttach()
  • uv_loop_new()
在前两种情况下,我使用了“redisAsyncDisconnect”来释放内存,但在第三种情况下找不到正确的方法。对于第四个,我使用了uv_stop()。但是valgrind仍然说,这四种方法中肯定都有内存丢失,释放内存的正确方法是什么?

只要这样做,就会显示出方法
redisLibuvAttach()

该文件中关闭的
方法显示您可以简单地
释放(句柄->数据)


或者确保调用了该方法。

我相信您尝试了
redisLibuvDetach()
?:)@这三种方法都适用于Eregrith?不,就像一对用于
redisLibuv*Attach*()
的方法一样,我不认为有这样的方法,我所有的方法都是指向redisAsyncContext的指针,使用redisAsyncDisconnect()会出现分段错误,redisFree()可以工作,但在valgrind中会显示为内存丢失。是否有任何hiredis功能可以正常释放?
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;
}
static void on_close(uv_handle_t* handle) {
  redisLibuvEvents* p = (redisLibuvEvents*)handle->data;

  free(p);
}