这是单例
#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 中有这个单例。怎么可能做到这一点?