Я получаю нарушение прав доступа в моей программе при запуске некоторого кода, принадлежащего библиотеке. Моя программа статически ссылается на библиотеку. Я могу запустить этот код в других проектах без проблем, но по какой-то причине он вылетает в моей программе. Я поместил код в самом начале программы, чтобы убедиться, что никакой другой код не был выполнен, и он все еще падает. Я не думаю, что это проблема с библиотекой, так как она отлично работает в других контекстах. Я понятия не имею, почему это терпит крах, и я пытаюсь понять это в течение двух недель. Вот более подробный пост, который я скопировал на страницу библиотеки github:
Я пытаюсь использовать http_listener в проекте MFC, встроенном в visual studio 2017 с набором инструментов платформы v141. Он работает нормально, пока не выполнится код, который ссылается на cpprestsdk. Cpprestsdk был установлен с помощью vcpkg, который собрал cpprestsdk с помощью набора инструментов платформы vc141.
В моем проекте нет известных ранее проблем с повреждением кучи, поэтому тот факт, что это вызывает повреждение кучи, сбивает с толку.
Вот неправильная строка кода:
BOOL CAuthenticationServerApp::InitInstance()
{
CWinApp::InitInstance();
utility::string_t port = U("34568");
utility::string_t address = U("http://127.0.0.1:");
address.append(port);
web::uri_builder uri(address);
auto addr = uri.to_uri().to_string();
---->std::unique_ptr<http_listener> listener = std::make_unique<http_listener>(addr);
listener->open().wait();
...
Первое, что выполняет моя программа, - это код. Перед ним нет другого кода, поэтому ничего, что потенциально могло бы вызвать поврежденную кучу, поэтому я думаю, что это как-то связано с самой библиотекой.
Сообщение об ошибке:
Исключение, выданное в 0x005B90F8 в AuthenticationServer.exe: 0xC0000005: Место записи нарушения прав доступа 0x0B39D000.
Возникло необработанное исключение: нарушение прав записи.
Вот стек вызовов, в который выдается исключение. Это сбой при попытке объявить переменную в конструкторе http_listener_impl:
AuthenticationServer.exe!std::_Ptr_base<Concurrency::details::_Task_impl<unsigned char> >::_Ptr_base<Concurrency::details::_Task_impl<unsigned char> >() Line 1158 C++
AuthenticationServer.exe!std::shared_ptr<Concurrency::details::_Task_impl<unsigned char> >::shared_ptr<Concurrency::details::_Task_impl<unsigned char> >(void * __formal) Line 1277 C++
AuthenticationServer.exe!Concurrency::task<unsigned char>::task<unsigned char>() Line 2963 C++
AuthenticationServer.exe!Concurrency::task<void>::task<void>() Line 3985 C++
AuthenticationServer.exe!web::http::experimental::listener::details::http_listener_impl::http_listener_impl(web::uri address) Line 58 C++
AuthenticationServer.exe!utility::details::make_unique<web::http::experimental::listener::details::http_listener_impl,web::uri>(web::uri && arg1) Line 389 C++
AuthenticationServer.exe!web::http::experimental::listener::http_listener::http_listener(web::uri address) Line 222 C++
[External Code]
AuthenticationServer.exe!CAuthenticationServerApp::InitInstance() Line 79 C++
AuthenticationServer.exe!AfxWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * lpCmdLine, int nCmdShow) Line 37 C++
AuthenticationServer.exe!WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * lpCmdLine, int nCmdShow) Line 26 C++
[External Code]
Этот код на самом деле работает нормально, если я помещу его в новый проект MFC или другой проект MFC аналогичного размера. Возможно ли, что есть проблема с библиотекой, или это связано с моим кодом? У программы действительно есть некоторые глобальные переменные, которые я проверил, и ни одна из них не содержит кода, который выделяет или освобождает память в куче их конструкторов. Так что я не знаю, как куча становится поврежденной. Проект связан с несколькими другими библиотеками, и я гарантировал, что все они были собраны с использованием одного и того же набора инструментов платформы. В библиотеках нет известных проблем, и они использовались годами. Я поместил код http_listener в другой проект, который почти идентичен этому, с теми же зависимостями, и он работает нормально.