C++ 破坏io_服务时引发ASIO访问冲突
我目前正在从事一个项目,我创建了一个C++ 破坏io_服务时引发ASIO访问冲突,c++,sockets,visual-c++,boost,boost-asio,C++,Sockets,Visual C++,Boost,Boost Asio,我目前正在从事一个项目,我创建了一个boost::asio::ip::udp::socket,并将其设置为异步侦听来自客户端的数据。我正在使用CMake为Linux和Windows 10部署环境生成项目文件 使用GCC和Clang在Linux上运行的代码没有问题,但是,当我使用MSVC和visualstudio在Release模式下运行时,程序退出时会出现访问冲突 以下是我得到的错误: Exception thrown at 0x00007FFB51954989 (ntdll.dll) in W
boost::asio::ip::udp::socket
,并将其设置为异步侦听来自客户端的数据。我正在使用CMake为Linux和Windows 10部署环境生成项目文件
使用GCC和Clang在Linux上运行的代码没有问题,但是,当我使用MSVC和visualstudio在Release
模式下运行时,程序退出时会出现访问冲突
以下是我得到的错误:
Exception thrown at 0x00007FFB51954989 (ntdll.dll) in Weave_Server.exe: 0xC0000005: Access violation writing location 0x0000000000000024.
堆栈显示在销毁myNetworkManager
类时发生此异常:
编辑:这是具有我的udp::socket
和io\u服务
对象的对象的析构函数。调用完全析构函数,错误来自正在销毁的io_服务
或正在清理的udp::socket
中的某个地方。udp::socket
是一个std::shared_ptr
,当此函数超出范围时将被销毁:
通过一些研究,我知道
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\u USE\u STATIC\u LIBS
,两种设置中都会发生相同的错误
是否有人知道为什么会抛出此异常,或者是否有一些设置用于检查我缺少的调试与发布版本?谢谢发生此问题是因为当我的
NetworkManager
析构函数超出范围时,io_服务
对象被销毁。这是有问题的,因为我使用的是udp::socket::async\u recvFrom
,它仍在尝试访问io\u服务
对象
可以通过传入对
io\u服务
对象的引用并通过默认构造函数创建套接字来解决此问题,或者,如果不想立即创建套接字,可以使用指向io\u服务
的共享指针并传入该引用 从图中,我将查看析构函数第23行,看看您是否能说出它导致空指针解引用的原因。请确保您在发布配置中使用发布二进制文件,在调试配置中使用调试二进制文件。在Visual Studio中,对于基于c++
的代码,不要混合使用这些工具是很重要的。当我编译boost并将我的工具集指定为msvc
时,这些库是使用-gd
生成的,用于调试,而不用于发布。在VisualStudio项目中,我不需要添加任何附加依赖项
,只需添加一个附加库目录
文件夹。MSVC可能会试图链接调试lib
文件吗?它可能会使用pragma自动链接。我以前在其他方面见过pragma
链接语法,但我不会将其用于链接Boost(除非它在某处自动执行)。在项目解决方案中,我是否可以看到链接器是否正在使用它?