lil*_*zek 1 c++ boost runtime boost-asio visual-studio-2012
我正在为我的项目使用Visual Studio 2012而且我是使用boost的新手,所以我遇到了运行时问题,试图初始化它:
FClient::FClient(const std::string & logName, const std::string & logPassword, udp::endpoint hostpoint) : mSocket(mService), mLogName(logName), mLogPassword(logPassword), mEndPoint(hostpoint)
{
}
Run Code Online (Sandbox Code Playgroud)
凡mSocket是升压UDP套接字,并MSERVICE是升压ASIO io_service对象(包括FClient的私有成员),我想调用(这基本上是串inits)的其余部分都没有检测到错误有用.我希望错误是在mSocket(mService)初始化的类型:
boost::asio::ip::udp::socket(boost::asio::io_service)
Run Code Online (Sandbox Code Playgroud)
Visual Studio调用堆栈:http: //pastebin.com/fjwWbhst
我正在使用带有1.5.6的Windows 8,我正在定义:-D_WIN32_WINNT = 0x0602
谢谢,
-lilEzek
我知道这已经过时了,但我遇到了类似的问题,并且发现了这篇文章.我发现问题是在构建IO服务之前套接字正在初始化.因此,当使用非构造的IO服务调用套接字构造函数时,它会导致段错误.
在C++中,类成员的构造顺序由它们在类声明中列出的顺序决定(通常在.h文件中).所以,如果,FClient声明如下:
class FClient
{
// ...
boost::asio::ip::udp::socket mSocket;
boost::asio::io_service mService;
// ...
};
Run Code Online (Sandbox Code Playgroud)
你在施工过程中得到了一个段落错误FClient::mSocket.解决方法是交换的顺序mSocket和mService:
class FClient
{
// ...
boost::asio::io_service mService;
boost::asio::ip::udp::socket mSocket;
// ...
};
Run Code Online (Sandbox Code Playgroud)
这确保mService在传递给mSocket构造函数之前构造.