概览
我正在编写一个辅助类,以便使用 xRedis 更轻松地调用 Redis C++ 中的驱动程序,但在向实例请求或发送任何信息时,我不断收到段错误。
我认为这与我存储 xRedis 和 RedisDBIdx 实例的方式有关,也可能与我在主应用程序中存储 RedisAdmin 实例的方式有关,但我看不到正确的设置方式这些经过多次尝试。
下面是相关代码,以及我自己采取的调试步骤的一些注意事项。
调试说明
- Redis Server启动成功,日志输出显示实例启动成功连接到服务器
- 无论是set命令还是exists命令发送到服务器,调用都会失败
GDB 输出如下所示,日志显示在 exists 或 set 调用上发生的相同情况:
Program received signal SIGSEGV, Segmentation fault. RedisPool::GetConnection (this=0x0, cahcetype=0, dbindex=0, ioType=0) at src/xRedisPool.cpp:124 124 || (ioType>SLAVE)
代码
redis_admin.h
#include "xredis/xRedisClient.h"
#include <string.h>
#include <string>
class xRedisAdmin
{
xRedisClient xRed;
public:
xRedisAdmin(RedisNode conn_list[], int conn_list_size);
~xRedisAdmin();
const char * load ( const char * key );
bool save ( const char * key, const char * msg );
bool exists ( const char * key );
bool del ( const char * key );
};
redis_admin.cpp
xRedisAdmin::xRedisAdmin(RedisNode conn_list[], int conn_list_size)
{
enum {
CACHE_TYPE_1,
CACHE_TYPE_2,
CACHE_TYPE_MAX,
};
xRed.Init(CACHE_TYPE_MAX);
bool bret = xRed.ConnectRedisCache(conn_list, conn_list_size, CACHE_TYPE_1);
//Log results
}
//Exists
bool xRedisAdmin::exists(const char * key)
{
RedisDBIdx d(&xRedis);
char szKey[256] = {0};
sprintf(szKey, key);
return xRed.exists(d, szKey);
}
//Save
bool xRedisAdmin::save(const char * key, const char * val)
{
RedisDBIdx d(&xRed);
char szKey[256] = {0};
sprintf(szKey, key);
bool ret_val = xRed.set(d, szKey, val);
//Log output
return ret_val;
}
main.cpp
xRedisAdmin *xRed;
void example_callback() {
bool bRet = xRed->save("key", "c_str");
}
int main()
{
xRedisAdmin x (RedisList1, conn_list_size);
xRed = &x;
example_callback();
return 0;
}
最佳答案
事实证明,这就是我违反三分法则的结果。
我没有 Redis Admin 的复制构造函数,因此其中的 xRed 对象在赋值时变为 null。使用 new 和 delete,而不是在 main 方法中创建,确实解决了这个问题。证明了问题的解决方案
感谢所有评论并给我答案和支持的人!
亚历克斯
关于c++ - 访问单例 C++ 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37781619/