我目前正在开发一个创建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.
堆栈显示此异常发生在我的NetworkManager
类销毁上:
编辑:这是具有我的udp::socket
和io_service
对象的对象的析构函数。调用了完整的析构函数,并且错误来自io_service
被销毁或udp::socket
被清除的某个地方。 udp::socket
是std::shared_ptr
,当此函数超出范围时将被销毁:
通过一些研究,我知道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
,并且两种设置都发生相同的错误。
是否有人对为什么抛出此异常有任何想法,或者是否有一些设置来检查我缺少的“调试与发行”?谢谢
答案 0 :(得分:0)
之所以发生此问题,是因为我的io_service
析构函数超出范围时NetworkManager
对象被破坏了。这是有问题的,因为我正在使用udp::socket::async_recvFrom
,但仍在尝试访问io_service
对象。
可以通过传递对io_service
对象的引用并通过默认构造函数创建套接字来解决该问题,或者可以使用指向io_service
的共享指针并传递该引用如果您不想立即创建套接字。