我维护的代码有一个名为Receiver的类,它包含一个名为WinsockManagement的静态类,它在无参数构造函数中执行WSAStartup和WSARelease调用。所以在.h文件中我有:
class CWinSockManagement
{
public:
bool m_bInit;
CWinSockManagement(void);
~CWinSockManagement(void);
};
class Receiver
{
static CWinSockManagement wsaManager;
....
在cpp文件中我有构造函数的实现和以下声明:
CWinSockManagement Receiver::wsaManager;
(我也尝试过:
CWinSockManagement Receiver::wsaManager = CWinSockManagement();
)
我希望在接收器类的第一个实例化之前到达CWinSockManagement的构造函数,但是构造函数中的断点永远不会被击中。我做错了什么,是否有更好的方法来自动处理WSAStartup和发布序列?
编辑: 我看了一下When and how are static data initialized in C++?这个被认为是重复的问题,但我看不出相似之处。这个问题是关于我的静态成员的构造函数未被调用的事实,尽管它应该如下面的评论所指出的那样:http://ideone.com/knx2p6
程序本身运行正常(它“只是”错过了它的套接字通信)。 Receiver类不是静态类。根据配置,可以有1到n个动态分配的Receiver实例。 Receiver类位于一个编译单元(也在一个VS项目中),它链接到静态库。 Receiver实例的实例化是在链接到DLL / .ax文件的不同编译单元(和VS项目)中完成的。有没有人看到这可能会阻止静态成员被初始化或者它们的构造函数被调用?