我正在尝试编写一个类,以便使用cURL从C ++网站中获取一些数据。这是该类的示例(有一个Curl * curl_数据成员,rawData_是一个字符串)。此摘录来自实现文件,所有函数均在标头中声明。
MyClass::MyClass()
{
curl_global_init(CURL_GLOBAL_ALL);
curl_ = curl_easy_init();
curl_easy_setopt(curl_, CURLOPT_URL,
"http://www.google.com");
curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, &MyClass::writeCallback);
}
MyClass::~MyClass()
{
curl_easy_cleanup(curl_);
curl_global_cleanup();
}
size_t MyClass::writeCallback(char* buf, size_t size, size_t nmemb, void* up)
{
//buf is a pointer to the data that curl has for us
//size*nmemb is the size of the buffer
for (size_t c = 0; c<size*nmemb; ++c)
{
cerr << c << endl;
rawData_.push_back(buf[c]);
}
return size*nmemb; //tell curl how many bytes we handled
}
void MyClass::makeCall()
{
curl_easy_perform(curl_);
}
Run Code Online (Sandbox Code Playgroud)
当我创建MyClass的实例并调用makeCall时,writeCallBack函数中存在一个段错误。即,buf的大小似乎为0(当c = 0时,它在buf [c]的调用上中断)。任何帮助表示赞赏
该参数curl_easy_setopt与CURLOPT_WRITEFUNCTION被认为是类型size_t function( char *ptr, size_t size, size_t nmemb, void *userdata)。那是“干净的” C函数,而不是方法。
但是据我所知,您正在传递一个非静态方法的地址。因此它将没有正确的签名(我猜它是非静态的,因为您正在其中使用rawData_它)。
现在,curl_easy_setopt并不在乎-您需要付出任何代价。但是,当调用该函数时,会发生不好的事情。
我的建议是声明writeCallback为静态(或什至是非成员好友)并将userdata设置为this(curl_easy_setopt与结合使用CURLOPT_WRITEDATA)。然后,您可以将userdata参数强制转换为该参数,MyClass并在函数内部使用它。