C 使用valgrind的hiredis内存泄漏
我在使用hiredis的代码上运行了valgrind,它指出了代码中的以下各行: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仍然说,这四种方法中肯定都有内存丢失,释放内存的正确方法是什么?只要这样做,就会显示出
- redisAsyncConnect()
- redisAsyncConnectUnix()
- redisLibuvAttach()
- uv_loop_new()
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);
}