分段错误访问Singleton C ++

时间:2016-06-13 03:59:28

标签: c++ class pointers redis segmentation-fault

概述

我正在编写一个帮助程序类,使用C ++中的xRedis驱动程序更容易调用Redis,但在向实例请求或发送任何信息时,我不断收到分段错误。

我认为这与我存储xRedis和RedisDBIdx实例的方式有关,可能与我在主应用程序中存储RedisAdmin实例的方式有关,但是我无法看到正确的设置方式经过几次尝试,这些都有了。

下面是相关代码,以及我自己调试的一些调试步骤。

调试笔记

  • Redis Server已成功启动,日志输出显示实例启动时与服务器的成功连接
  • 无论是否将set或exists命令发送到服务器,调用都会失败
  • 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)
    

代码

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;
}

1 个答案:

答案 0 :(得分:0)

事实证明,这是我违反三权规则所得到的。

我没有Redis Admin的复制构造函数,因此,其中的xRed对象在赋值时变为null。使用新的&amp;删除,而不是在主方法中创建,确实解决了问题。证明了解决问题的方法

感谢所有评论并给我答案的人支持!

亚历