首先贴出运行结果:
未解决内存安全的运行结果,get获取的value 失效:
g++ -Wall -Wextra -g -o redis_example redis_svr.cxx -L/usr/local/lib -lhiredis -Wl,-rpath=/usr/local/lib [zryTest@master redis_test]$ ./redis_example SET: OK GET: value1 GET: � Value: � DEL: 1 SET: OK EXPIRE: 1
解决内存安全之后的运行结果,get 获取的value正常传出:
[zryTest@master redis_test]$ make all g++ -Wall -Wextra -g -o redis_example redis_svr.cxx -L/usr/local/lib -lhiredis -Wl,-rpath=/usr/local/lib [zryTest@master redis_test]$ ./redis_example SET: OK GET: value1 GET: value1 Value: value1 DEL: 1 SET: OK EXPIRE: 1 [zryTest@master redis_test]$
涉及到的部分代码:(修改后正确的)
class { ....... const char *get(const char *key) { redisReply *reply = (redisReply *)redisCommand(c, "GET %s", key); // printf("GET: %s\n", reply->str); const char *value = NULL; if (reply != NULL && reply->type == REDIS_REPLY_STRING) { value = strdup(reply->str); printf("GET: %s\n", value); } else { printf("GET: NULL\n"); } return value; } ....... }
注意:不同于set 接口,使用redisReply对象接收 redisCommand的返回结果时,只是OK 这样的信息。
使用 get 接口时,我们要将返回结果传出,同时还要清理释放redisReply对象,如果直接使用return 时返回指针。由于经过了freeReplyObject的清理,此时指针指向空间已经被污染了。