我正在尝试编写一个类,以便使用cURL从C++网站中获取一些数据。这是该类的示例(有一个Curl * curl_数据成员,rawData_是一个字符串)。此摘录来自实现文件,所有函数都在 header 中声明。

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_);
}

当我创建MyClass的实例并调用makeCall时,writeCallBack函数中存在一个段错误。即,buf的大小似乎为0(当c = 0时,buf [c]的调用会中断)。任何帮助表示赞赏

最佳答案

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

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

现在,curl_easy_setopt并不真正在乎-它需要您提供的一切。但是,当调用该函数时,会发生不好的事情。

我的建议是将writeCallback声明为静态(甚至是非成员 friend ),并将userdata设置为this(将curl_easy_setoptCURLOPT_WRITEDATA结合使用)。然后,您可以将userdata参数转换为MyClass并在函数内部使用它。

关于c++ - libcurl/cURL C++段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13537244/

10-14 09:29