带有字符串抛出bad_alloc用户数据的 curl 写入回调
Curl write callback with string throws bad_alloc for user data
>我像这样定义了一个CurlHelper:
/*CurlHelper.hpp */
class CurlHelper
{
public:
...
CURLcode RunCurl(void);
CURLcode CurlRead(long timeout);
size_t WriteCallback(void * contents, size_t size, size_t nb, string* userData);
string getDataBuffer(void);
....
private:
CURL *m_curl;
string m_url;
string m_urlResponseData;
};
/* CurlHelper.cpp*/
size_t CurlHelper::WriteCallback(void * contents,
size_t size,
size_t nmemb,
string * userData)
{
size_t realSize = size * nmemb;
if(userData)
{
userData->append(static_cast<const char *>(contents), realSize);
}
return realSize;
}
CURLcode CurlHelper::CurlRead(long timeout)
{
CURLcode ec = CURLE_UNKNOWN_OPTION;
if(!m_url.empty())
cout << " m_url: " << m_url.c_str() << endl;
if(m_curl)
{
if(CURLE_OK == (ec = curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, &CurlHelper::WriteCallback))
&& CURLE_OK == (ec = curl_easy_setopt(m_curl, CURLOPT_NOPROGRESS, 1L))
&& CURLE_OK == (ec = curl_easy_setopt(m_curl, CURLOPT_FOLLOWLOCATION, 1L))
&& CURLE_OK == (ec = curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &m_urlResponseData))
&& CURLE_OK == (ec = curl_easy_setopt(m_curl, CURLOPT_TIMEOUT, timeout))
&& CURLE_OK == (ec = curl_easy_setopt(m_curl, CURLOPT_URL, m_url.c_str())))
{
cout << "Successfully set CURL Read options"<< endl;
}
}
return ec;
}
CURLcode CurlHelper::RunCurl(void)
{
if(m_urlResponseData.empty())
cout << " m_urlResponseData is empty "<< endl;
CURLcode ec = curl_easy_perform(m_curl);
if(ec != CURLE_OK)
{
cout << "RunCurl Failed with " << curl_easy_strerror(ec)<<endl;
}
else
{
cout << "Successfully performed CURL request"<<endl;
}
return ec;
}
/* client code */
CURLcode ec = CURLE_UNKNOWN_OPTION;
CurlHelper* urlObj = new CurlHelper("www.google.com");
if((ec = urlObj.CurlRead(20)) != CURLE_OK)
{
cout <<"Failed to set read curl options" << endl;
}
else if((ec = urlObj.RunCurl()) != CURLE_OK)
{
cout <<"Failed to perform curl request" << endl;
}
现在,编译器在 WriteCallback 中为我传入的 userData 对象抛出bad_alloc。我的目的是将获得的字节存储到m_urlResponseData中以供将来处理。
你能帮我理解这个问题吗?
根据 Wilx 的建议,我打印了 realSize 值,结果非常高,并在这里找到了解决方案:http://curl.haxx.se/mail/lib-2009-04/0069.html
我已经相应地更改了代码,并且更改以粗体显示:
/* CurlHelper.hpp*/
**size_t WriteCallback(void * contents, size_t size, size_t nb);
static size_t WriteCallbackWrapper(void * contents, size_t size, size_t nb, void* thisPtr)
{
if(thisPtr)
return ((CurlHelper *)thisPtr)->WriteCallback(contents, size, nb);
else
return 0;
}**
/* CurlHelper.cpp*/
CURLcode CurlHelper::CurlRead(long timeout)
{
CURLcode ec = CURLE_UNKNOWN_OPTION;
if(!m_url.empty())
cout << " m_url: " << m_url.c_str() << endl;
if(m_curl)
{
**if(CURLE_OK == (ec = curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, &CurlHelper::WriteCallbackWrapper))**
&& CURLE_OK == (ec = curl_easy_setopt(m_curl, CURLOPT_NOPROGRESS, 1L))
&& CURLE_OK == (ec = curl_easy_setopt(m_curl, CURLOPT_FOLLOWLOCATION, 1L))
&& **CURLE_OK == (ec = curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, this)**)
&& CURLE_OK == (ec = curl_easy_setopt(m_curl, CURLOPT_TIMEOUT, timeout))
&& CURLE_OK == (ec = curl_easy_setopt(m_curl, CURLOPT_URL, m_url.c_str())))
{
cout << "Successfully set CURL Read options"<< endl;
}
}
return ec;
}
size_t CurlHelper::WriteCallback(void * contents, size_t size, size_t nmemb)
{
size_t realSize = size * nmemb;
cout <<"realSize: " << realSize << endl;
**try
{
m_urlResponseData.append(static_cast<const char *>(contents), realSize);
}
catch(bad_alloc& ba)
{
cerr<<"Failed: "<<ba.what() << endl;
return 0;
}**
return realSize;
}
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何对点云数据进行排序
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 在运行时处理类型擦除的数据-如何不重新发明轮子