Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 破坏io_服务时引发ASIO访问冲突_C++_Sockets_Visual C++_Boost_Boost Asio - Fatal编程技术网

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.

堆栈显示在销毁my
NetworkManager
类时发生此异常:

编辑:这是具有我的
udp::socket
io\u服务
对象的对象的析构函数。调用完全析构函数,错误来自正在销毁的
io_服务
或正在清理的
udp::socket
中的某个地方。
udp::socket
是一个
std::shared_ptr
,当此函数超出范围时将被销毁:

通过一些研究,我知道NTDLL.DLL>代码>用于调试VisualStudioC++项目的符号,这有意义的是它为什么会在发布模式下崩溃(因为不应该加载调试符号)。p> 为什么项目要尝试从发布模式项目中访问任何调试符号?这是我需要在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\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(除非它在某处自动执行)。在项目解决方案中,我是否可以看到链接器是否正在使用它?