c++ - 访问单例 C++ 的段错误

标签 c++ class pointers redis segmentation-fault

概览

我正在编写一个辅助类,以便使用 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/

相关文章:

c++ - 使用像素坐标的 OpenGL 子图像

C++:不删除对象/总是/内存泄漏吗?

class - 将服务注入(inject)类(不是组件)Angular2

C 变量和指针

c - strchr() 非 const 的返回类型?

c++ - 如何使用指针从不同的函数访问局部变量?

c++ - 使用 guest 对象更改类中构​​造函数的调用顺序

c++ - 如何在 const struct 中初始化 union ?

c++ - 排序数组最快的搜索方法是什么?

c++ - 使用 C 类将华氏度转换为摄氏度