由单独源文件中的全局变量引起的 C++ 段错误

标签 c++ string segmentation-fault

我现在是一个 C++ 新手,已经解决了 4 个小时的问题。我遇到了第一个段错误。我认为它来自可变数据。该程序从网页中提取 html(使用 cURL),但在提取一些 HTML 后出现段错误。我正在调用“curlbar::getThreads();”来自 main.cpp。代码在 main.cpp 中时运行良好,但当我将其放入 curlbar 时,出现段错误(核心转储)错误:

/*
* 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();

工作原理

这使用 easy-curl 句柄的用户定义数据参数选项来建立将与您的静态 writer-callback 一起发回的数据片段。该数据作为回调的 void *up 参数提供。所以我们传递指针 this 并在静态回调中使用 static_cast 给我们一个对象指针,pThis。我们使用该指针来触发具有相似名称的 member 函数,但不再需要 up 参数。

关于由单独源文件中的全局变量引起的 C++ 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21542723/

相关文章:

c - 如何制作 int val[100000000] 数组?

c++ - 另一个类的类指针数组的类指针数组的段错误

c++ - 如何在C++中旋转 vector 中的每个第N个元素

c++ - 是否可以在每个类中只传递一次变量而不是将其设为静态?

Python2 json : load using strings instead of unicode

java - oracle中三串列的公共(public)子串合并

c++ - 函数头后面的 `const` 是什么意思?

c++ - 如何计算 OpenCV 2.3 中的摄像头?

c - s 需要类型为 char c 的参数,但参数 2 的类型为 'int' 警告和错误返回

有人可以帮我确定 C 中 Seg 错误的原因以及 gdb 输出的含义吗?