Может ли повреждение кучи быть вызвано связыванием проблем? - PullRequest
2 голосов
/ 30 марта 2019

Я получаю нарушение прав доступа в моей программе при запуске некоторого кода, принадлежащего библиотеке. Моя программа статически ссылается на библиотеку. Я могу запустить этот код в других проектах без проблем, но по какой-то причине он вылетает в моей программе. Я поместил код в самом начале программы, чтобы убедиться, что никакой другой код не был выполнен, и он все еще падает. Я не думаю, что это проблема с библиотекой, так как она отлично работает в других контекстах. Я понятия не имею, почему это терпит крах, и я пытаюсь понять это в течение двух недель. Вот более подробный пост, который я скопировал на страницу библиотеки 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 в другой проект, который почти идентичен этому, с теми же зависимостями, и он работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...