gpt4 book ai didi

c - 使用 valgrind 的 hiredis 中的内存泄漏

转载 作者:IT王子 更新时间:2023-10-29 06:14:42 26 4
gpt4 key购买 nike

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

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

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

最佳答案

只是在做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);
}

或者只是确保该方法被调用。

关于c - 使用 valgrind 的 hiredis 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30046114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com