如何正确传递zmq context(void *)?

时间:2014-08-16 00:56:17

标签: c++ c zeromq void-pointers

我正在使用zmq的本机C库来编写我的应用程序(应用程序本身是用C ++编写的)。 ZMQ版本是4.04。我遇到的问题是我有一个工厂类,它提供对zmq上下文的单独访问,这是一个由zmq_ctx_new ()创建的void指针。 zmq上下文本身存储为静态成员变量,并提供getter方法来访问对此变量的引用。这个类本身很简单,这里是完整的代码:

zmq_ctx_factory.h

#include <zmq.h>
#include <cassert>

class ZmqCtxFactory
{
public:
  static void* get_ctx()
  {
    assert (zmq_ctx_ != (void*) NULL);
    return &zmq_ctx_;
  }

  static bool is_initialized()
  {
    return is_initialized_;
  }

  static void init()
  {
    zmq_ctx_ = zmq_ctx_new ();
    is_initialized_ = true;
  }
private:
  static void* zmq_ctx_;
  static bool is_initialized_;
};

zmq_ctx_factory.cpp

#include "zmq_ctx_factory.h"

bool ZmqCtxFactory::is_initialized_ = false;
void* ZmqCtxFactory::zmq_ctx_ = NULL;

以下问题,在我的客户端代码中,下面会出错(错误代码14,错误地址)

void* context = ZmqCtxFactory::get_ctx();
assert (context != (void*) NULL);
socket_ = zmq_socket (context, ZMQ_SUB);

但如果我将ZmqCtxFactory::get_ctx();替换为zmq_ctx_new ();,则代码可以正常工作。如您所见,我有一个断言来确保上下文不是NULL,这意味着ctx变量已成功创建。 (根据文档,如果创建失败,zmq_ctx_new ()将返回NULL)。我很困惑,为什么工厂返回的参考不起作用?

2 个答案:

答案 0 :(得分:1)

ZmqCtxFactory::get_ctx()似乎返回指针的地址,而不是指针本身。

尝试

static void* get_ctx()
{
    assert (zmq_ctx_ != (void*) NULL);
    return zmq_ctx_; // instead of return &zmq_ctx_;
}

答案 1 :(得分:1)

问题是static void* get_ctx()没有返回引用,它返回void指针的地址。将方法更改为以下代码后工作正常:

static void*& get_ctx()
  {
    assert (zmq_ctx_ != (void*) NULL);
    return zmq_ctx_;
  }