首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在http_client构造函数中崩溃(Casablanca )

在http_client构造函数中崩溃(Casablanca )
EN

Stack Overflow用户
提问于 2019-05-13 15:01:08
回答 2查看 403关注 0票数 0

我试图使用Casablanca来使用REST。我一直在遵循微软的教程,我怎么会崩溃,我也搞不懂。

我和C++11一起使用了2017

我编写了一个函数GetRequest(),它可以在一个新的空项目中使用,但是当我尝试在我的项目上使用它时(有数百万个代码行的非常大的项目)。我在http_client的构造函数中崩溃,在文件xmemory0第118行中。

代码语言:javascript
复制
const uintptr_t _Ptr_container = _Ptr_user[-1];

这是一个指向调用堆栈的链接:https://i.imgur.com/lBm0Hv7.png

代码语言:javascript
复制
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()时,它就不会崩溃。我想这一定是由于一些内存问题,但是我不知道如何调试它。有人会想到这件事吗?

谢谢,祝您今天愉快!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-22 15:23:36

我想这个问题是非常具体的,它可能永远不会涉及到任何人,但我仍然要更新我发现的一切。

在这个项目中,我们使用自定义分配器,如果我没有错,就不可能将自定义分配器交给这个库,这会导致许多随机崩溃。

修复它的一个很好的选择是使用这个库的静态版本,但是,由于我们使用了大量的动态库,所以这个选项对我们来说是不可能的。

如果你对我的情况,我会建议使用libcurl和rapidjson,这是有点难使用,但你可以达到同样的目标。

票数 0
EN

Stack Overflow用户

发布于 2020-07-14 16:12:16

我在ubuntu上也经历过类似的问题。它在一个空项目中工作,但是当它被放入一个现有的大型项目中时,会随机崩溃,并抱怨内存损坏。

原来,现有的项目加载了一个专有库,它在内部使用cpprestsdk (casablanca)。即使是cpprestsdk也是静态链接的,它的符号仍然作为弱符号导出。所以要么我的代码崩溃,要么专有库崩溃。

理想情况下,我的项目可以分成几个库,然后用RTLD_LOCAL加载它们,以避免符号冲突。但是我的项目中的专有库只接受RTLD_GLOBAL,否则它会崩溃.因此,进口订单和标志变得非常重要:

代码语言:javascript
复制
dlopen("my-lib-uses-cpprest", RTLD_LOCAL); //To avoid polluting the global
dlopen("proprietary-lib-with-built-in-cpprest", RTLD_GLOBAL); //In my case, this lib must be global
dlopen("another-lib-uses-cpprest", RTLD_DEEPBIND); //To avoid being affected by global

“这可能永远不会关系到任何人。”

我同意这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56115040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档