C++;libcurl补丁请求无法通过.str.c_str()进行stringstream转换 < >我通过C++ LIbCURL库发送补丁请求,当我将“有效载荷”硬编码到程序中时,它工作100%而没有任何问题,但是,我希望它通过,所以我使用StruGWrand创建它。当我用stringstream发送它时,服务器响应400个错误请求,而当我手动输入它时,程序运行时没有错误

C++;libcurl补丁请求无法通过.str.c_str()进行stringstream转换 < >我通过C++ LIbCURL库发送补丁请求,当我将“有效载荷”硬编码到程序中时,它工作100%而没有任何问题,但是,我希望它通过,所以我使用StruGWrand创建它。当我用stringstream发送它时,服务器响应400个错误请求,而当我手动输入它时,程序运行时没有错误,c++,json,curl,format,libcurl,C++,Json,Curl,Format,Libcurl,这就是我硬编码时它的外观(和工作原理) curl\u easy\u setopt(curl,CURLOPT\u POSTFIELDS,“{\”region\”:“us central\”) 这就是我用stringstream格式化它的方式(出于某种原因,它不起作用) stringstream payload; payload << "{\"region\":\""; payload << c_codes[i]; payload << "\"}"; strin

这就是我硬编码时它的外观(和工作原理)

curl\u easy\u setopt(curl,CURLOPT\u POSTFIELDS,“{\”region\”:“us central\”)

这就是我用stringstream格式化它的方式(出于某种原因,它不起作用)

stringstream payload;
payload << "{\"region\":\"";
payload << c_codes[i];
payload << "\"}";
stringstream有效载荷;
payload
payload.str()
返回一个临时值。然后
c_str()
获取一个指向该临时文件管理的字符序列的指针。然后该临时文件被销毁,其中的字符被删除;指针变为悬空。然后cURL发送该指针指向的内存中的任何垃圾,该内存曾经保存字符数据,但现在不再保存

你需要像这样的东西

std::string data = payload.str();
curl_easy_setopt(..., data.c_str());
然后确保在处理请求时,
数据始终处于活动状态。

问题如前所述,但我只想发布一个替代解决方案:

您可以使用而不是CURLOPT_POSTFIELDS,则payload.str().c_str()将是安全的,因为curl将为您制作字符串的副本,而字符串的生命周期不再是您的责任,而是curl的责任。

或者您可以使用而不是CURLOPT_POSTFIELDS,然后payload.str().c_str()这样做是安全的,而且您不必关心字符串的生命周期,curl将为您保留(字符串的一个副本)字符串。