Сбой внутри конструктора http_client (Casablanca SDK) - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь использовать Касабланку, чтобы потреблять REST API. Я следую учебному пособию по Microsoft, как только я получаю сбой, и я не могу понять это.

Я использую Visual Studio 2017 с C ++ 11

Я кодировал функцию GetRequest (), которая работает, когда используется в новом пустом проекте, но когда я пытаюсь использовать ее в своем проекте (очень большой проект с миллионами строк кода). У меня сбой в конструкторе http_client, в файле xmemory0 строка 118.

const uintptr_t _Ptr_container = _Ptr_user[-1];

Это ссылка на стек вызовов: https://i.imgur.com/lBm0Hv7.png

void RestManager::GetRequest()
{
    auto fileStream = std::make_shared<ostream>();

    // Open stream to output file.
    pplx::task<void> requestTask = fstream::open_ostream(U("results.html")).then([=](ostream outFile)
    {
        *fileStream = outFile;

        // Create http_client to send the request.
        http_client client(U("XXX/XXX.svc/"));

        // Build request URI and start the request.
        uri_builder builder(U("/IsLive"));
        builder.append_query(U("q"), U("cpprestsdk github"));
        return client.request(methods::GET, builder.to_string());
    })

        // Handle response headers arriving.
        .then([=](http_response response)
    {
        printf("Received response status code:%u\n", response.status_code());

        // Write response body into the file.
    return response.body().read_to_end(fileStream->streambuf());
    })    

        // Close the file stream.
        .then([=](size_t)
    {
        return fileStream->close();
    });

    // Wait for all the outstanding I/O to complete and handle any exceptions
    try
    {
        requestTask.wait();
    }
    catch (const std::exception &e)
    {
        printf("Error exception:%s\n", e.what());
    }

}

РЕДАКТИРОВАТЬ: Я просто хочу добавить, что проблема в конструкторе http_client. Внутри него всегда происходит сбой, независимо от того, что я посылаю в качестве параметра.

Странно то, что он не падает, когда я просто делаю main (), который вызывает эту функцию. Я предполагаю, что это должно быть связано с некоторыми проблемами с памятью, однако я понятия не имею, как я мог отладить это У кого-нибудь есть идеи по этому поводу?

Спасибо и хорошего дня!

1 Ответ

0 голосов
/ 22 мая 2019

Я думаю, что эти проблемы были очень специфическими, и, вероятно, они никогда никого не коснутся, но все же я собираюсь обновить все, что я узнал об этом.

В этом проекте мы используем собственный распределительЕсли я не ошибаюсь, невозможно передать наш пользовательский распределитель этой библиотеке, что приведет к множеству случайных сбоев.

Хороший вариант исправить это - использовать статическую версию этой библиотеки,однако, поскольку мы используем много динамических библиотек, эта опция для нас была невозможна.

Если у вас дело, я бы посоветовал использовать libcurl и rapidjson, его немного сложнее использовать, но вы можете достичь той же цели.

...