Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rest http_客户端构造函数(卡萨布兰卡SDK)内部崩溃_Rest_C++11_Casablanca - Fatal编程技术网

Rest http_客户端构造函数(卡萨布兰卡SDK)内部崩溃

Rest http_客户端构造函数(卡萨布兰卡SDK)内部崩溃,rest,c++11,casablanca,Rest,C++11,Casablanca,我正在尝试使用卡萨布兰卡来使用RESTAPI。 我一直在学习微软的教程,我是如何遇到崩溃的,但我无法理解 我正在使用visual studio 2017和C++11 我编写了一个函数GetRequest(),它在一个新的空项目中使用时可以工作,但在我的项目(有数百万代码行的非常大的项目)中尝试使用它时可以工作。 我在文件xmemory0第118行的http_客户端的构造函数中崩溃了 const uintptr_t _Ptr_container = _Ptr_user[-1]; 这是到调用堆栈的

我正在尝试使用卡萨布兰卡来使用RESTAPI。 我一直在学习微软的教程,我是如何遇到崩溃的,但我无法理解

我正在使用visual studio 2017和C++11

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

const uintptr_t _Ptr_container = _Ptr_user[-1];
这是到调用堆栈的链接:

void RestManager::GetRequest()
{
auto fileStream=std::make_shared();
//打开流以输出文件。
pplx::task requestTask=fstream::open_ostream(U(“results.html”))。然后([=](ostream outFile)
{
*fileStream=outFile;
//创建http_客户端以发送请求。
http_客户端(U(“XXX/XXX.svc/”);
//生成请求URI并启动请求。
uri_builder(U(“/IsLive”);
附加查询(U(“q”)、U(“cpprestsdk github”);
返回client.request(方法::GET,builder.to_string());
})
//处理到达的响应头。
。然后([=](http_响应)
{
printf(“收到的响应状态代码:%u\n”,response.status_code());
//将响应主体写入文件。
返回response.body();
})    
//关闭文件流。
。然后([=](大小)
{
返回fileStream->close();
});
//等待所有未完成的I/O完成并处理任何异常
尝试
{
requestTask.wait();
}
捕获(const std::exception&e)
{
printf(“错误异常:%s\n”,例如what());
}
}
编辑:我只想补充一点,http_客户端构造函数是问题所在。无论我发送什么作为参数,它总是在它内部崩溃

wierd的一点是,当我只创建一个调用此函数的main()时,它不会崩溃。 我猜这一定是由于一些内存问题,但我不知道如何调试它。 有人会对此有想法吗


谢谢,祝你今天愉快

我想这是一个非常具体的问题,可能不会引起任何人的关注,但我还是会更新我所发现的一切

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

一个很好的修复方法是使用静态版本来修复这个库,但是,因为我们使用了很多动态库,所以这个选项对我们来说是不可能的


如果你是我的情况,我会建议你使用libcurl和rapidjson,虽然使用起来有点困难,但你可以达到同样的目的。

我想这个问题非常具体,可能不会引起任何人的关注,但我还是会更新我所发现的一切

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

一个很好的修复方法是使用静态版本来修复这个库,但是,因为我们使用了很多动态库,所以这个选项对我们来说是不可能的


如果你同意我的观点,我建议你使用libcurl和rapidjson,虽然使用起来有点困难,但你可以达到同样的目的。

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

事实证明,现有项目加载了一个专有库,该库在内部使用cpprestsdk(卡萨布兰卡)。即使cpprestsdk是静态链接的,其符号仍然作为弱符号导出。所以要么我的代码崩溃,要么专有库崩溃

理想情况下,我的项目可以分成几个库,并使用
RTLD_LOCAL
加载它们,以避免符号冲突。但是我的项目中的专有库只接受
RTLD\u 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

“这可能永远不会涉及任何人。”


我同意这一点。

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

事实证明,现有项目加载了一个专有库,该库在内部使用cpprestsdk(卡萨布兰卡)。即使cpprestsdk是静态链接的,其符号仍然作为弱符号导出。所以要么我的代码崩溃,要么专有库崩溃

理想情况下,我的项目可以分成几个库,并使用
RTLD_LOCAL
加载它们,以避免符号冲突。但是我的项目中的专有库只接受
RTLD\u 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

“这可能永远不会涉及任何人。”

我同意这一点