我试图使用Casablanca来使用REST。我一直在遵循微软的教程,我怎么会崩溃,我也搞不懂。
我和C++11一起使用了2017
我编写了一个函数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()时,它就不会崩溃。我想这一定是由于一些内存问题,但是我不知道如何调试它。有人会想到这件事吗?
谢谢,祝您今天愉快!
发布于 2019-05-22 15:23:36
我想这个问题是非常具体的,它可能永远不会涉及到任何人,但我仍然要更新我发现的一切。
在这个项目中,我们使用自定义分配器,如果我没有错,就不可能将自定义分配器交给这个库,这会导致许多随机崩溃。
修复它的一个很好的选择是使用这个库的静态版本,但是,由于我们使用了大量的动态库,所以这个选项对我们来说是不可能的。
如果你对我的情况,我会建议使用libcurl和rapidjson,这是有点难使用,但你可以达到同样的目标。
发布于 2020-07-14 16:12:16
我在ubuntu上也经历过类似的问题。它在一个空项目中工作,但是当它被放入一个现有的大型项目中时,会随机崩溃,并抱怨内存损坏。
原来,现有的项目加载了一个专有库,它在内部使用cpprestsdk (casablanca)。即使是cpprestsdk也是静态链接的,它的符号仍然作为弱符号导出。所以要么我的代码崩溃,要么专有库崩溃。
理想情况下,我的项目可以分成几个库,然后用RTLD_LOCAL加载它们,以避免符号冲突。但是我的项目中的专有库只接受RTLD_GLOBAL,否则它会崩溃.因此,进口订单和标志变得非常重要:
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“这可能永远不会关系到任何人。”
我同意这一点。
https://stackoverflow.com/questions/56115040
复制相似问题