在破坏io_service时加强对ASIO访问的违反

时间:2019-03-29 17:14:21

标签: c++ sockets visual-c++ boost boost-asio

我目前正在开发一个创建boost::asio::ip::udp::socket并将其设置为异步侦听来自客户端的数据的项目。我正在使用CMake为Linux和Windows 10部署环境生成项目文件。

我在带有GCC和Clang的Linux上运行的代码没有问题,但是,当我在MSVC和Visual Studio的Release模式下运行时,在程序退出时遇到访问冲突。

这是我得到的错误:

Exception thrown at 0x00007FFB51954989 (ntdll.dll) in Weave_Server.exe: 0xC0000005: Access violation writing location 0x0000000000000024.

enter image description here

堆栈显示此异常发生在我的NetworkManager类销毁上:

enter image description here

编辑:这是具有我的udp::socketio_service对象的对象的析构函数。调用了完整的析构函数,并且错误来自io_service被销毁或udp::socket被清除的某个地方。 udp::socketstd::shared_ptr,当此函数超出范围时将被销毁: enter image description here

通过一些研究,我知道ntdll.dll用于调试Visual Studio C ++项目的符号,这很有意义为什么它会在Release模式下崩溃(因为不应加载调试符号)。

为什么项目会尝试从发布模式项目中访问任何调试符号?这是我需要在CMake文件中设置的设置吗?

在这里,我在CMakeLists.txt中为该项目感到鼓舞:


if ( MSVC )
    set( Boost_USE_STATIC_LIBS          ON  ) 
else()
    set( Boost_USE_STATIC_LIBS          OFF  )
endif()
set( Boost_DETAILED_FAILURE_MSG     ON  )    # Useful error messages from boost
set( Boost_USE_STATIC_RUNTIME       OFF )    
set( Boost_DEBUG                    OFF )    # Print debug info from find boost

FIND_PACKAGE( Boost COMPONENTS system regex REQUIRED )

if( Boost_FOUND )
    message( STATUS      "Success, Boost found!" )
else()
    message( ERROR      "Cannot find boost! Exiting..." )
    return()
endif()

我可以想到的另一件事是更改Boost是静态链接还是动态链接,但是我更改了BOOST_USE_STATIC_LIBS,并且两种设置都发生相同的错误。

是否有人对为什么抛出此异常有任何想法,或者是否有一些设置来检查我缺少的“调试与发行”?谢谢

1 个答案:

答案 0 :(得分:0)

之所以发生此问题,是因为我的io_service析构函数超出范围时NetworkManager对象被破坏了。这是有问题的,因为我正在使用udp::socket::async_recvFrom,但仍在尝试访问io_service对象。

可以通过传递对io_service对象的引用并通过默认构造函数创建套接字来解决该问题,或者可以使用指向io_service的共享指针并传递该引用如果您不想立即创建套接字。