【发布时间】:2014-08-16 00:56:17
【问题描述】:
我正在使用 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)。我很困惑,为什么工厂返回的引用不起作用?
【问题讨论】:
标签: c++ c zeromq void-pointers