【实战】使用hiredis 时怎么解决返回的查询结果和对象释放的问题

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 解决内存安全之后的运行结果,get 获取的value正常传出:

首先贴出运行结果:

未解决内存安全的运行结果,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的清理,此时指针指向空间已经被污染了。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
目录
相关文章
|
Ubuntu
Ubuntu 20.04 安装 Fira Code 字体
Ubuntu 20.04 安装 Fira Code 字体
1287 0
|
NoSQL Redis C语言
[hiredis 的Redis执行语句返回结果类型全说明
[hiredis 的Redis执行语句返回结果类型全说明
169 1
|
11月前
|
编解码 语音技术 内存技术
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
《FFmpeg开发实战:从零基础到短视频上线》一书中的“5.1.2 把音频流保存为PCM文件”章节介绍了将媒体文件中的音频流转换为原始PCM音频的方法。示例代码直接保存解码后的PCM数据,保留了原始音频的采样频率、声道数量和采样位数。但在实际应用中,有时需要特定规格的PCM音频。例如,某些语音识别引擎仅接受16位PCM数据,而标准MP3音频通常采用32位采样,因此需将32位MP3音频转换为16位PCM音频。
286 0
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
|
12月前
|
网络协议 数据安全/隐私保护
Rsync 服务端配置
Rsync 服务端配置
266 14
|
存储 缓存 JSON
详解HTTP四种请求:POST、GET、DELETE、PUT
【4月更文挑战第3天】
65231 3
详解HTTP四种请求:POST、GET、DELETE、PUT
|
数据可视化
Echarts高级进阶教程(3):appendData大数据量分片加载数据增量渲染和常规思路异步加载数据的对比,对折线图是无效的
Echarts高级进阶教程(3):appendData大数据量分片加载数据增量渲染和常规思路异步加载数据的对比,对折线图是无效的
815 0
|
关系型数据库 MySQL API
PyMySQL:连接Python与MySQL的桥梁
PyMySQL:连接Python与MySQL的桥梁
|
并行计算 编译器 程序员
提升C/C++编程效率:深入C/C++ for循环的优化与应用
提升C/C++编程效率:深入C/C++ for循环的优化与应用
1691 0
|
数据可视化 Ubuntu Shell
数据可视化工具APITable:实现强大的多维表格功能并公网访问
数据可视化工具APITable:实现强大的多维表格功能并公网访问
956 0
|
缓存 前端开发 JavaScript
【面试题】 webpack面试篇
【面试题】 webpack面试篇
818 0