【发布时间】:2016-02-20 21:39:53
【问题描述】:
我的班级有以下三种方法-
void WebCrawler::crawl()
{
urlQueue.push("http://www.google.com/");
if(!urlQueue.empty())
{
std::string url = urlQueue.front();
urlQueue.pop();
pastURLs.push_back(url);
if(pastURLs.size()>4000000)
{
pastURLs.erase(pastURLs.begin());
}
std::string data=getData(url);
auto newPair= std::pair<std::string, std::string>(url, data);
dataQueue.push(newPair);
}
}
std::string WebCrawler::getData(std::string URL)
{
std::string readBuffer = "";
CURL *curl = curl_easy_init();
if(curl)
{
CURLcode res;
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WebCrawler::WiteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
curl_easy_setopt(curl, CURLOPT_URL, URL.c_str());
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
return readBuffer;
}
和
size_t WebCrawler::WiteCallback(char* buf, size_t size, size_t nmemb, void* up)
{
((std::string*)up)->append((char*)buf, size * nmemb);
return size * nmemb;
}
当我将这些方法从我的类中取出并将它们作为函数运行时,我的代码会正确执行并返回网页内容。但是,一旦我将这些方法放入我的类中,它们的行为就会开始不同。当我的 WriteCallback 被调用时,程序失败并说它无法分配 45457340335435776 字节的数据。我对导致这种变化的原因感到有些困惑,我们将不胜感激。
【问题讨论】:
-
调试此类问题的第一步是构建一个完整的最小测试用例,事实上,我们要求您这样做,因为我们不能/如果没有问题,将无法帮助您!
-
您是否尝试过通过调试器运行它以查看传递给回调的参数?此外,如果 curl 是 C 库,则不能将 C++ 类成员函数传递给它。我认为它至少需要一个静态类函数。