我正在编写一个帮助程序类,使用C ++中的xRedis驱动程序更容易调用Redis,但在向实例请求或发送任何信息时,我不断收到分段错误。
我认为这与我存储xRedis和RedisDBIdx实例的方式有关,可能与我在主应用程序中存储RedisAdmin实例的方式有关,但是我无法看到正确的设置方式经过几次尝试,这些都有了。
下面是相关代码,以及我自己调试的一些调试步骤。
GDB输出如下所示,日志显示在存在或设置调用中发生相同的事件:
Program received signal SIGSEGV, Segmentation fault.
RedisPool::GetConnection (this=0x0, cahcetype=0, dbindex=0, ioType=0) at src/xRedisPool.cpp:124
124 || (ioType>SLAVE)
#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 );
};
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;
}
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;
}
答案 0 :(得分:0)
事实证明,这是我违反三权规则所得到的。
我没有Redis Admin的复制构造函数,因此,其中的xRed对象在赋值时变为null。使用新的&amp;删除,而不是在主方法中创建,确实解决了问题。证明了解决问题的方法
感谢所有评论并给我答案的人支持!
亚历