C 细分故障由全局变量在单独的源文件中引起



我现在是C NOOB麻烦射击4小时。我会得到我的第一个细分错误。我认为它来自可变数据。该程序从网页中拉出HTML(使用卷发),但在获取一些HTML后会出现SEG故障。我称为" curlbar :: getThreads();"来自main.cpp。当它全部在main.cpp中时,该代码正常工作,但是当我将其放入curlbar中时,我得到了segfault(core dovsted)错误:

/*
* curlbar.cpp
*
*  Created on: Feb 2, 2014
* 
*/
//get list of threads
#include "headers.h"
class curlbar{
public:
string data;
size_t writeContents(char* buf, size_t size, size_t nmemb, void* up){
        for(unsigned int c = 0; c<size*nmemb; c++){
            this->data.push_back(buf[c]);
        }
        return size*nmemb;
}
static void getThreads(){
    CURL* curl;
    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_URL, "www.somewebsiteblahblah.com");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curlbar::writeContents);
    curl_easy_setopt(curl, CURLOPT_VERBOSE,1L); //tell curl to output its progress
    curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    curl_global_cleanup();
}
};

是"字符串数据";没有足够的记忆分配?我应该如何解决此问题?

我很确定这就是您所缺少的。您无法通过回调传递会员函数,因为呼叫者不知道如何适当地将this作为第一个参数。

但是您可以做到这一点:

class curlbar
{
private:
    // callback version used for curl-write-function
    static size_t writeContents_s(char *buf, size_t size, size_t nmemb, void *up)
    {
        curlbar* pThis = static_cast<curlbar*>(up);
        return pThis->writeContents(buf, size, nmemb);
    }
public:
    std::string data;
    // member version
    size_t writeContents(char* buf, size_t size, size_t nmemb)
    {
        std::copy(buf, buf+(size*nmemb), std::back_inserter(data));
        return size*nmemb;
    }
    void getThreads()
    {
        CURL* curl;
        curl_global_init(CURL_GLOBAL_ALL);
        curl = curl_easy_init();
        curl_easy_setopt(curl, CURLOPT_URL, "www.somewebsiteblahblah.com");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curlbar::writeContents_s);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, this); // NOTE ADDITION
        curl_easy_setopt(curl, CURLOPT_VERBOSE,1L); //tell curl to output its progress
        curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        curl_global_cleanup();
    }
};

给定一个curlbar obj;对象,您将其调用为

curlbar obj;
obj.getThreads();

如何工作

这使用了易于折扣句柄的用户定义的数据参数选项,以建立将与您的 static writer-allback一起发送的prief-o-data。该数据作为回调的void *up参数提供。因此,我们通过指针this,在静态回调中使用static_cast为我们提供对象指针pThis。我们使用该指针启动类似名称的成员函数,但不再需要up参数。

相关内容

  • 没有找到相关文章

最新更新