我在Windows上遇到asio的奇怪行为:某些io_service.post()
发生了分段错误。这是我使用的代码:
main.cpp中:
#include <asio/io_service.hpp>
#include <windows.h>
#include "foo.h"
asio::io_service ios;
int main()
{
ios.post(foo);
ios.run();
return 0;
}
foo.h中:
#ifndef FOO_H
#define FOO_H
#include <windows.h>
#include <asio/io_service.hpp>
void foo();
#endif
Foo.cpp中:
#include "foo.h"
#include <iostream>
extern asio::io_service ios;
void bar() { std::cout << "bar\n"; }
void foo()
{
ios.post(bar);
}
我编译: g ++ -o test.exe -Wall -Wextra -std = c ++ 11 -D_WIN32_WINNT = _WIN32_WINNT_WIN7 -DWIN32_LEAN_AND_MEAN -DASIO_STANDALONE -Iasio-1.10.6 / include foo.cpp main.cpp -lws2_32
(注意:ios
全局对象用于简化代码,但在我的真实程序中,io_service对象在main
中创建,并通过foo
回调中的引用进行访问)。
执行时,我在post
电话上遇到分段错误。
我的环境:windows 7,mingw-w64 5.2 with dwarf2,asio 1.10.6。 我使用mingw-w64 4.7.2和4.9.3以及使用boost.asio 1.55获得相同的bug。
要修复崩溃,可以使用一些解决方法:
在报告asio项目的错误之前,我确信我的代码是正确的。对我来说,强加io_service.hpp和windows.h的包含顺序是不可接受的:这两个标题通常间接包含在其他标题中,因此很难控制它。