使用boost io_service初始化boost udp套接字时出错

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

pla*_*dia 5

我知道这已经过时了,但我遇到了类似的问题,并且发现了这篇文章.我发现问题是在构建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.解决方法是交换的顺序mSocketmService:

class FClient
{
    // ...
    boost::asio::io_service mService;
    boost::asio::ip::udp::socket mSocket;
    // ...
};
Run Code Online (Sandbox Code Playgroud)

这确保mService在传递给mSocket构造函数之前构造.