【发布时间】:2013-11-15 00:35:37
【问题描述】:
这是单身
#pragma once
class ContextManager {
public:
static ContextManager& Instance() {
static ContextManager instance;
return instance;
}
zmq::context_t& GetContext() { return ctx_;}
private:
zmq::context_t ctx_;
~ContextManager() {}
};
我有一个 DLL,其中包含一些有用的网络实用程序,构建在 ZeroMQ 之上,并且使用这个单例不必传递上下文。
我将此 DLL 链接到运行测试套件的 EXE。这个测试套件工作,发送和接收一些消息。当程序退出时,ContextManager 析构函数崩溃说“断言失败:尚未执行成功的 WSASTARTUP (......\src\signaler .cpp:137)"
更多详情:
- 应用程序是单线程的。
- 如果我只是从 .EXE 调用 Instance.GetContext() 方法并返回(不运行测试,不再调用 DLL 接口),那么它也会失败。
- 如果我在 main 之前定义这个单例(因此,在 exe 内部而不使用 DLL 中的对象),那么 它可以工作。
- WSastartup 只需调用一次即可。
我不想向 DLL 客户端公开任何实现细节,所以我希望在 DLL 中包含这个单例。怎么可能做到这一点?
【问题讨论】:
-
如果我在其他类中进行 context_t 保留和销毁并且它没有暴露给 .EXE,那么它工作正常......但我不知道为什么我不能使用单例暴露。