libcurl / cURL C ++段错误

Gue*_*111 2 c++ curl

我正在尝试编写一个类,以便使用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]的调用上中断)。任何帮助表示赞赏

Omr*_*rel 5

该参数curl_easy_setoptCURLOPT_WRITEFUNCTION被认为是类型size_t function( char *ptr, size_t size, size_t nmemb, void *userdata)。那是“干净的” C函数,而不是方法。

但是据我所知,您正在传递一个非静态方法的地址。因此它将没有正确的签名(我猜它是非静态的,因为您正在其中使用rawData_它)。

现在,curl_easy_setopt并不在乎-您需要付出任何代价。但是,当调用该函数时,会发生不好的事情。

我的建议是声明writeCallback为静态(或什至是非成员好友)并将userdata设置为thiscurl_easy_setopt与结合使用CURLOPT_WRITEDATA)。然后,您可以将userdata参数强制转换为该参数,MyClass并在函数内部使用它。