我在使用hiredis的代码上运行了valgrind,它在我的代码中指出了以下单独的行:
- redisAsyncConnect()
- redisAsyncConnectUnix()
- redisLibuvAttach()
- uv_loop_new()
在前两种情况下,我使用“redisAsyncDisconnect”来释放内存,但在第三种情况下找不到正确的方法。对于第四个,我使用了 uv_stop()。但是 valgrind 仍然说这四个中肯定存在内存损失,释放内存的正确方法是什么?
我在使用hiredis的代码上运行了valgrind,它在我的代码中指出了以下单独的行:
在前两种情况下,我使用“redisAsyncDisconnect”来释放内存,但在第三种情况下找不到正确的方法。对于第四个,我使用了 uv_stop()。但是 valgrind 仍然说这四个中肯定存在内存损失,释放内存的正确方法是什么?
只是做一个简单的谷歌搜索显示该方法redisLibuvAttach()
只是做一个简单的 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);
}
或者只是确保调用该方法。