[英]C++ Segmentation Fault caused by global variable in separate source file
我现在是4个小时的c ++ noob麻烦。 我收到了第一个分段错误。 我认为它来自可变数据。 该程序从网页中提取html(使用cURL),但在获取一些HTML后会出现seg错误。 我叫“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一起发回的piece-o-data。 该数据作为回调的void *up
参数提供。 所以我们传递指针this
并在静态回调中使用static_cast
给我们一个对象指针pThis
。 我们使用该指针来触发类似名称的成员函数,但不再需要up
参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.