В настоящее время я работаю над проектом, в котором я создаю boost::asio::ip::udp::socket
и настраиваю его для асинхронного прослушивания данных от клиентов.Я использую CMake для создания файлов моего проекта для среды развертывания Linux и Windows 10.
У меня нет проблем с кодом, работающим в Linux с GCC и Clang, однако, когда я работаю в режиме Release
с MSVC и Visual Studio, я получаю нарушение прав доступа при выходе из программы.
Вот ошибка, которую я получаю:
Exception thrown at 0x00007FFB51954989 (ntdll.dll) in Weave_Server.exe: 0xC0000005: Access violation writing location 0x0000000000000024.
Стек показывает, что это исключение происходит при уничтожениимоего NetworkManager
класса:
РЕДАКТИРОВАТЬ: Здесь является destrcutor для объекта, который имеет мой 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
и та же ошибка возникает в обеих настройках.
У кого-нибудь есть идеи относительно того, почему выбрасывается это исключение, или какие-то настройки для проверки на наличие Отладки и Выпуска, которые мне не хватает?Спасибо