簡體   English   中英

由單獨的源文件中的全局變量引起的C ++分段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM